Como imprimir um objeto groupby

133

Quero imprimir o resultado do agrupamento com os pandas.

Eu tenho um quadro de dados:

import pandas as pd
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})
print(df)

       A  B
0    one  0
1    one  1
2    two  2
3  three  3
4  three  4
5    one  5

Ao imprimir após o agrupamento por 'A', tenho o seguinte:

print(df.groupby('A'))

<pandas.core.groupby.DataFrameGroupBy object at 0x05416E90>

Como posso imprimir o quadro de dados agrupado?

Se eu fizer:

print(df.groupby('A').head())

Eu obtenho o quadro de dados como se não estivesse agrupado:

             A  B
A                
one   0    one  0
      1    one  1
two   2    two  2
three 3  three  3
      4  three  4
one   5    one  5

Eu estava esperando algo como:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
two   2    two  2
three 3  three  3
      4  three  4
user3465658
fonte
Estou obtendo saída correta com print df.groupby('A').head(). qual versão dos pandas você tem?
Amit Verma
Acabei de atualizar para 0.13.1 no meu desktop e laptop.
user3465658
1
Que tal "listar ()" o objeto diretamente? E então você pode manipular / imprimir como uma estrutura de dados normal.
amigos estão dizendo sobre trópico
Até onde eu sei, nenhuma resposta consegue produzir a saída desejada. Para este exemplo específico, o mais próximo que pude encontrar foi df.groupby(['A', 'B']).sum(), mas falharia se os ('A', 'B')pares não fossem únicos.
Eric Duminil

Respostas:

100

Simplesmente faça:

grouped_df = df.groupby('A')

for key, item in grouped_df:
    print(grouped_df.get_group(key), "\n\n")

Isso também funciona,

grouped_df = df.groupby('A')    
gb = grouped_df.groups

for key, values in gb.iteritems():
    print(df.ix[values], "\n\n")

Para agrupamento seletivo de chaves: insira as chaves desejadas dentro de key_list_from_gb, a seguir, usando gb.keys(): Por exemplo,

gb = grouped_df.groups
gb.keys()

key_list_from_gb = [key1, key2, key3]

for key, values in gb.items():
    if key in key_list_from_gb:
        print(df.ix[values], "\n")
Surya
fonte
1
Outra opção é:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen
__iter __ () também funciona Devolve gerador de sequências produzindo de (nome, objeto subsetted) para cada grupo.
Jeremy Z
Por que não fazer um loop key_list_from_gb?
pfnuesel 11/09/19
66

Se você está simplesmente procurando uma maneira de exibi-lo, você pode usar o descrevem ():

grp = df.groupby['colName']
grp.describe()

Isso fornece uma mesa limpa.

Swagath
fonte
6
É uma mesa limpa, mas não é a mesa desejada.
Eric Duminil
15

Confirmei que o comportamento das head()alterações entre as versões 0.12 e 0.13. Isso parece um bug para mim. Eu criei um problema .

Mas uma operação groupby na verdade não retorna um DataFrame classificado por grupo. O .head()método é um pouco enganador aqui - é apenas um recurso de conveniência que permite reexaminar o objeto (neste caso df) que você agrupou. O resultado de groupbyé um tipo separado de objeto, um GroupByobjeto. Você deve apply, transformoufilter para voltar a uma trama de dados ou Series.

Se tudo que você queria fazer era classificar pelos valores nas colunas A, você deve usar df.sort('A').

Dan Allan
fonte
4
observe que, headna verdade, head(5)ele está mostrando as 5 primeiras linhas, mais corretas para 'mostrar' o quadro df.groupby('A').apply(lambda x: x), o que é efetivamente um passthru. Suponho que você possa ter um pass()método, talvez.
Jeff
13

Outra alternativa simples:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)
Sumit Pokhrel
fonte
9

Além disso, outra alternativa simples pode ser:

gb = df.groupby("A")
gb.count() # or,
gb.get_group(your_key)
Surya
fonte
7

Além das respostas anteriores:

Tomando o seu exemplo,

df = pd.DataFrame({'A': ['one', 'one', 'two', 'three', 'three', 'one'], 'B': range(6)})

Então, um código simples de 1 linha

df.groupby('A').apply(print)
QPeiran
fonte
4

Agradecemos a Surya por boas idéias. Eu limparia a solução dele e simplesmente faria:

for key, value in df.groupby('A'):
    print(key, value)
mimoralea
fonte
3

Lista de chamadas () no objeto GroupBy

print(list(df.groupby('A')))

da-te:

[('one',      A  B
0  one  0
1  one  1
5  one  5), ('three',        A  B
3  three  3
4  three  4), ('two',      A  B
2  two  2)]
Elizabeth Orrico
fonte
Sim, isso precisa de mais votos! Você pode fazer isso também depois de agrupar o objeto. df_g = df.groupby ('A'), então você pode chamar a lista (df_g) ou se quiser apenas a primeira lista de chamadas em grupo (df_g) [0]. Isso é uma coisa que eu gosto no R sobre Python. No R, você não precisa percorrer a maioria dos objetos para ver os dados, mas o Python é necessário em muitos objetos. Encontrar processos como este é refrescante. Obrigado Elizabeth.
PVic 30/06
2

você não pode ver os dados groupBy diretamente pela instrução print, mas pode ver iterando sobre o grupo usando o loop for tente este código para ver o grupo por dados

group = df.groupby('A') #group variable contains groupby data
for A,A_df in group: # A is your column and A_df is group of one kind at a time
  print(A)
  print(A_df)

você obterá uma saída depois de tentar isso como um resultado de grupo

Espero que ajude

praveen kumar
fonte
2

No Jupyter Notebook, se você fizer o seguinte, ele imprimirá uma boa versão agrupada do objeto. O applymétodo ajuda na criação de um quadro de dados multi-índice.

by = 'A'  # groupby 'by' argument
df.groupby(by).apply(lambda a: a[:])

Resultado:

             A  B
A                
one   0    one  0
      1    one  1
      5    one  5
three 3  three  3
      4  three  4
two   2    two  2

Se você deseja que a by(s) coluna (s) não apareça na saída, basta soltar a (s) coluna (s), assim.

df.groupby(by).apply(lambda a: a.drop(by, axis=1)[:])

Resultado:

         B
A         
one   0  0
      1  1
      5  5
three 3  3
      4  4
two   2  2

Aqui, não tenho certeza do porquê .iloc[:]não funciona em vez de [:]no final. Portanto, se houver alguns problemas no futuro devido a atualizações (ou no momento), .iloc[:len(a)]também funcionará.

Barnik Biswas
fonte
0

Eu achei uma maneira complicada, apenas para debater, veja o código:

df['a'] = df['A']  # create a shadow column for MultiIndexing
df.sort_values('A', inplace=True)
df.set_index(["A","a"], inplace=True)
print(df)

a saída:

             B
A     a
one   one    0
      one    1
      one    5
three three  3
      three  4
two   two    2

Os profissionais são tão fáceis de imprimir, pois retornam um dataframe, em vez de Groupby Object. E a saída parece boa. Enquanto o golpe é que ele cria uma série de dados redundantes.

Sheng Zhuang
fonte
0

Em python 3

k = None
for name_of_the_group, group in dict(df_group):
    if(k != name_of_the_group):
        print ('\n', name_of_the_group)
        print('..........','\n')
    print (group)
    k = name_of_the_group

De maneira mais interativa

Deepanshu Mehta
fonte
-2

para imprimir todas (ou arbitrariamente muitas) linhas do df agrupado:

import pandas as pd
pd.set_option('display.max_rows', 500)

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
randomWalk112358
fonte