Responder dúvida

Seja o primeiro a responder

Agrupar dados em um loop de várias planilhas

Python Avançado

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.

Foto de Jônatas S.
Jônatas perguntou há 1 ano