Comment imprimer un objet groupby

134

Je veux imprimer le résultat du regroupement avec Pandas.

J'ai un dataframe:

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

Lors de l'impression après regroupement par 'A', j'ai les éléments suivants:

print(df.groupby('A'))

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

Comment puis-je imprimer le dataframe groupé?

Si je fais:

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

J'obtiens le dataframe comme s'il n'était pas groupé:

             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

Je m'attendais à quelque chose comme:

             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
la source
J'obtiens une sortie correcte avec print df.groupby('A').head(). quelle version de pandas avez-vous?
Amit Verma
Je viens de mettre à jour la version 0.13.1 sur mon ordinateur de bureau et mon ordinateur portable.
user3465658
1
Que diriez-vous de "lister ()" l'objet directement? Et puis vous pouvez le manipuler / l'imprimer comme une structure de données normale.
Tropicpenguin
Pour autant que je sache, pas une seule réponse ne parvient à produire le résultat souhaité. Pour cet exemple spécifique, le plus proche que j'ai pu trouver était df.groupby(['A', 'B']).sum(), mais il échouerait si les ('A', 'B')paires ne sont pas uniques.
Eric Duminil

Réponses:

100

Faites simplement:

grouped_df = df.groupby('A')

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

Cela fonctionne également,

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

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

Pour le regroupement sélectif de touches: insérez les clés de votre choix dans le key_list_from_gb, dans ce qui suit, en utilisant gb.keys(): Par exemple,

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
la source
1
Une autre option est:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen
__iter __ () fonctionne également. Il renvoie la séquence génératrice de (nom, objet sous-défini) pour chaque groupe
Jeremy Z
Pourquoi ne pas faire une boucle key_list_from_gb?
pfnuesel du
66

Si vous cherchez simplement un moyen de l'afficher, vous pouvez utiliser describe ():

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

Cela vous donne une table soignée.

Swagath
la source
7
C'est une table soignée mais ce n'est pas la table souhaitée.
Eric Duminil
15

J'ai confirmé que le comportement des head()changements entre la version 0.12 et 0.13. Cela ressemble à un bug pour moi. J'ai créé un problème .

Mais une opération groupby ne renvoie pas réellement un DataFrame trié par groupe. La .head()méthode est un peu trompeuse ici - c'est juste une fonctionnalité pratique pour vous permettre de réexaminer l'objet (dans ce cas, df) que vous avez groupé. Le résultat groupbyest une sorte d'objet distinct, un GroupByobjet. Vous devez apply,transform ou filterpour revenir à un DataFrame ou à une série.

Si tout ce que vous vouliez faire était de trier par les valeurs des colonnes A, vous devriez utiliser df.sort('A').

Dan Allan
la source
4
notez qu'en headfait, head(5)il montre les 5 premières lignes, plus correct pour «montrer» le cadre df.groupby('A').apply(lambda x: x), ce qui est effectivement un passthru. Je suppose que vous pourriez avoir une pass()méthode, peut-être.
Jeff
13

Une autre alternative simple:

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

En outre, une autre alternative simple pourrait être:

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

En plus des réponses précédentes:

Prenant votre exemple,

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

Puis simple code 1 ligne

df.groupby('A').apply(print)
QPeiran
la source
4

Merci à Surya pour ses bonnes idées. Je nettoierais sa solution et ferais simplement:

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

Liste d'appels () sur l'objet GroupBy

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

vous donne:

[('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
la source
Ouais, cela a besoin de plus de votes! Vous pouvez le faire également après avoir groupé l'objet. df_g = df.groupby ('A') alors vous pouvez appeler la liste (df_g) ou si vous voulez juste la première liste d'appels de groupe (df_g) [0]. C'est une chose que j'aime à propos de R sur Python. Dans R, vous n'avez pas à parcourir la plupart des objets pour voir les données, mais Python vous devez le faire sur une grande partie de l'objet. Trouver des processus comme celui-ci est rafraîchissant. Merci Elizabeth.
PVic
2

vous ne pouvez pas voir les données groupBy directement par l'instruction d'impression mais vous pouvez voir en itérant sur le groupe en utilisant la boucle for essayez ce code pour voir le groupe par données

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)

vous obtiendrez une sortie après avoir essayé ceci comme résultat groupby

J'espère que ça aide

Praveen Kumar
la source
2

Dans Jupyter Notebook, si vous procédez comme suit, il imprime une jolie version groupée de l'objet. La applyméthode aide à créer une trame de données multi-index.

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

Production:

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

Si vous voulez que la byou les colonnes n'apparaissent pas dans la sortie, déposez simplement la ou les colonnes, comme ceci.

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

Production:

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

Ici, je ne suis pas sûr de savoir pourquoi .iloc[:]ne fonctionne pas au lieu de [:]la fin. Donc, s'il y a des problèmes à l'avenir en raison de mises à jour (ou actuellement), .iloc[:len(a)]fonctionne également.

Barnik Biswas
la source
0

J'ai trouvé un moyen délicat, juste pour le brainstorming, voir le code:

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)

le résultat:

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

Les avantages sont si faciles à imprimer, car ils renvoient une trame de données au lieu de Groupby Object. Et la sortie est belle. Alors que le contre est qu'il crée une série de données redondantes.

Sheng Zhuang
la source
0

En 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 manière plus interactive

Deepanshu Mehta
la source
-2

pour imprimer toutes (ou arbitrairement plusieurs) lignes du df groupé:

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

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