1
resposta

Pivot table ou Group by no Pandas

Bom dia!

Estou carregando os dados conforme abaixo:

dados = {
    'id_controle' : ['01', '03', '05', '11', '01', '03', '05', '11', '01', '04', '05', '89', '01', '04', '05', '89'],
    'id_material' : ['4000', '4000', '4000', '4000', '4000', '4000', '4000', '4000', '4001', '4001', '4001', '4001', '4002', '4002', '4002', '4002'],
    'id_planta' : ['0050', '0050', '0050', '0050', '0080', '0080', '0080', '0080', '0080', '0080', '0080', '0080', '0050', '0050', '0050', '0050'],
    'atributo1' : ['A', 'B', 'C', '', 'A', 'B', 'C', '', 'C', 'B', 'B', 'A', 'D', '', 'A', 'A'],
    'atributo2' : ['X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'],
    'atributo3' : ['', 'X', 'X', '', 'X', 'X', 'X', 'X', '', 'X', 'X', 'X', '', 'X', 'X', 'X']
}

df = pd.DataFrame(data=dados, dtype=str)

O meu objetivo é construir um agrupamento pelas colunas ['id_controle', 'id_planta'] cuja agregação me mostre a frequência dos valores para cada uma das outras colunas.

Fazendo df.groupby(['id_controle', 'id_planta']).count() obtenho um resultado semelhante ao que necessito, mas não consigo aninhar os valores das colunas e suas frequências! http://prntscr.com/qt1c9e

O mesmo quando faço

df.pivot_table(
    values='id_material', 
    index=['id_controle', 'id_planta'], 
    columns=['atributo1', 'atributo2', 'atributo3'], 
    aggfunc=len)

Aqui até consigo aninhar os valores e frequências, mas veja na imagem que eles ficam empilhados de forma que os dados não fazem sentido para a minha leitura. http://prntscr.com/qt1hi7

Me ajudem por favor! Estou quebrando a cabeça desde quarta-feira com este problema :(

1 resposta

Bom dia Allef!

Não entendi muito bem o resultado esperado, o problema no count com o groupby seria o multiindex?

Me diz se o código abaixo ajuda:

df.groupby(['id_controle', 'id_planta']).count().reset_index()

Saida:


E continuando do exemplo acima podemos simplificar mais a saída:

total = df.groupby(['id_controle', 'id_planta'])['id_material'].count().reset_index()
total.rename(columns={'id_material': 'total'}, inplace=True)

Resultado: