Olá, eu tenho um código que itera sobra várias planilhas que se diferenciam pela coluna 'bit' (que representa as bitolas das varas). Este código aloja os cortes (cada qual com seus respectivos tamanhos) que podem ser feitos em cada vara. Cada linha representa uma vara com os cortes alojados nela. Acontece que durante o alojamento, alguns cortes vieram repetidos, mas poderiam estar agrupados. Por exemplo: vara 1 [{'pos' 1, 'bit' 5.0, 'qtd' 2, 'cm' 150}, {'pos' 1, 'bit' 5.0, 'qtd' 2, 'cm' 150}, {'pos' 2, 'bit' 5.0, 'qtd' 1, 'cm' 230}]. Veja que há dois cortes com o mesmo tamaho de 150. A representação deveria vir assim: vara 1 [{'pos' 1, 'bit' 5.0, 'qtd' 4, 'cm' 150}, {'pos' 2, 'bit' 5.0, 'qtd' 1, 'cm' 230}]. O código que AGRUPA e itera sobre as tabelas do dataframe 'df_varas' (que contém as tabelas, cada quala com uma bitola, e já com os cortes alojados, mas NÃOagrupados) é:
def agrupar_cortes_linha(row):
cortes_agrupados = {}
for corte in row['Cortes']:
pos = corte['Pos']
bit = corte['Bit']
cm = corte['Cm']
qtd = corte['Qtd']
key = f'{pos}_{bit}_{cm}' # Usamos uma chave única com base em 'Pos', 'Bit' e 'Cm'
if key not in cortes_agrupados:
cortes_agrupados[key] = {'Pos': pos, 'Bit': bit, 'Cm': cm, 'Qtd': qtd}
else:
cortes_agrupados[key]['Qtd'] += qtd
return list(cortes_agrupados.values())
# Aplicar a função 'agrupar_cortes_linha' para cada linha do DataFrame 'df_barras'
df_varas['CortesAgrupados'] = df_varas.apply(agrupar_cortes_linha, axis=1)
# Imprimir o DataFrame 'df_varas' com a coluna 'CortesAgrupados'
display(df_varas).
Ele agrupa direitinho, mas apenas a última tabela com a bitola 'bit': 16.0. As demais tabelas com as demais bitolas, o são sobrepostas, ou não são iteradas, ou não são apenas impressas... eu não sei o que pode estar havendo.
Desde já agradeço.
def agrupar_cortes_linha(row):
cortes_agrupados = {}
for corte in row['Cortes']:
pos = corte['Pos'] bit = corte['Bit']
cm = corte['Cm'] qtd = corte['Qtd']
tabela = corte['Tabela'] key = f'{pos}_{bit}_{cm}_{tabela}' # Incluímos a coluna 'Tabela' na chave única
if key not in cortes_agrupados:
cortes_agrupados[key] = {'Pos': pos, 'Bit': bit, 'Cm': cm, 'Qtd': qtd, 'Tabela': tabela}
else:
cortes_agrupados[key]['Qtd'] += qtd return list(cortes_agrupados.values())
Verifique os Dados de Entrada: Certifique-se de que os dados de entrada para cada bitola específica estão corretos e contêm os cortes que você espera agrupar.
Imprima os Dados de Depuração: Adicione instruções de impressão dentro da função agrupar_cortes_linha
para verificar se os dados estão sendo processados corretamente. Isso pode ajudar a identificar onde o código não está funcionando conforme o esperado.
O código que você forneceu parece estar correto para agrupar os cortes dentro de cada linha do DataFrame df_varas
usando a função agrupar_cortes_linha
e armazenar os resultados agrupados na nova coluna CortesAgrupados
. O problema que você mencionou, onde apenas a última tabela com a bitola bit: 16.0
é corretamente agrupada e as outras são sobrepostas ou não são iteradas, pode estar relacionado a como o DataFrame df_varas
está estruturado ou como a operação de agrupamento está sendo aplicada.
Aqui estão algumas sugestões para diagnosticar e resolver o problema:
df_varas
Certifique-se de que df_varas
contém todas as linhas e tabelas que você espera antes de aplicar a função de agrupamento. Você pode fazer isso imprimindo as primeiras e últimas linhas do DataFrame
Verifique se a função agrupar_cortes_linha
está sendo aplicada a todas as linhas como esperado. Parece que você está aplicando a função corretamente com df_varas.apply(agrupar_cortes_linha, axis=1)
, o que deve aplicar a função a cada linha do DataFrame. Se cada "tabela" é uma linha em df_varas
, então a função deve ser aplicada a cada tabela individualmente.
Cortes
Garanta que a coluna Cortes
existe em todas as linhas de df_varas
e contém os dados esperados (lista de dicionários para cada corte). Se Cortes
estiver faltando ou for inconsistente, isso pode causar problemas na função de agrupamento.