Foto de Jônatas S.
Jônatas há 2 anos
Enviada pelo
Site

Agrupar dados em um loop de várias planilhas

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.

Professor Lucas M.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 2 anos
Contatar Lucas

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())

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Tire dúvidas com IA
Resposta na hora da Minerva IA
Enviar dúvida
Professor Bruno C.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 2 anos
Contatar Bruno
use R e tidyverse. muito melhor pra essas coisas

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Professor Jhonni S.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 1 ano
Contatar Jhonni
  1. 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.

  2. 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.

  3. Verifique o DataFrame para a Bitola Específica: Certifique-se de que você está filtrando corretamente o DataFrame antes de aplicar a função.

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Professor Amador R.
Identidade verificada
  • CPF verificado
  • E-mail verificado
Respondeu há 1 ano
Contatar Amador

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:

1. Verifique a Estrutura do DataFrame 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

2. Aplicar a Função Corretamente

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.

3. Verifique a Coluna 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.

Um professor já respondeu

Envie você também uma dúvida grátis
Ver resposta
Minerva IA
do Profes
Respostas na hora
100% no WhatsApp
Envie suas dúvidas pelo App. Baixe agora
Prefere professores para aulas particulares ou resolução de atividades?
Aulas particulares
Encontre um professor para combinar e agendar aulas particulares Buscar professor
Tarefas
Envie sua atividade, anexe os arquivos e receba ofertas dos professores Enviar tarefa