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
print df.groupby('A').head()
. qual versão dos pandas você tem?df.groupby(['A', 'B']).sum()
, mas falharia se os('A', 'B')
pares não fossem únicos.Respostas:
Simplesmente faça:
Isso também funciona,
Para agrupamento seletivo de chaves: insira as chaves desejadas dentro de
key_list_from_gb
, a seguir, usandogb.keys()
: Por exemplo,fonte
for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
key_list_from_gb
?Se você está simplesmente procurando uma maneira de exibi-lo, você pode usar o descrevem ():
Isso fornece uma mesa limpa.
fonte
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 casodf
) que você agrupou. O resultado degroupby
é um tipo separado de objeto, umGroupBy
objeto. Você deveapply
,transform
oufilter
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')
.fonte
head
na verdade,head(5)
ele está mostrando as 5 primeiras linhas, mais corretas para 'mostrar' o quadrodf.groupby('A').apply(lambda x: x)
, o que é efetivamente um passthru. Suponho que você possa ter umpass()
método, talvez.Outra alternativa simples:
fonte
Além disso, outra alternativa simples pode ser:
fonte
Além das respostas anteriores:
Tomando o seu exemplo,
Então, um código simples de 1 linha
fonte
Agradecemos a Surya por boas idéias. Eu limparia a solução dele e simplesmente faria:
fonte
Lista de chamadas () no objeto GroupBy
da-te:
fonte
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
você obterá uma saída depois de tentar isso como um resultado de grupo
Espero que ajude
fonte
No Jupyter Notebook, se você fizer o seguinte, ele imprimirá uma boa versão agrupada do objeto. O
apply
método ajuda na criação de um quadro de dados multi-índice.Resultado:
Se você deseja que a
by
(s) coluna (s) não apareça na saída, basta soltar a (s) coluna (s), assim.Resultado:
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á.fonte
Eu achei uma maneira complicada, apenas para debater, veja o código:
a saída:
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.
fonte
Em python 3
De maneira mais interativa
fonte
para imprimir todas (ou arbitrariamente muitas) linhas do df agrupado:
fonte