So drucken Sie ein Groupby-Objekt


133

Ich möchte das Ergebnis der Gruppierung mit Pandas drucken.

Ich habe einen Datenrahmen:

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

Beim Drucken nach Gruppierung nach 'A' habe ich Folgendes:

print(df.groupby('A'))

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

Wie kann ich den gruppierten Datenrahmen drucken?

Wenn ich mache:

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

Ich erhalte den Datenrahmen so, als wäre er nicht gruppiert:

             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

Ich hatte so etwas erwartet wie:

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

Ich bekomme die richtige Ausgabe mit print df.groupby('A').head(). Welche Version von Pandas hast du?
Amit Verma

Ich habe gerade auf meinem Desktop und meinem Laptop auf 0.13.1 aktualisiert.
user3465658

1
Wie wäre es, das Objekt direkt "aufzulisten ()"? Und dann können Sie es als normale Datenstruktur bearbeiten / drucken.
Tropicpenguin

Soweit ich das beurteilen kann, schafft es keine einzige Antwort, die gewünschte Ausgabe zu erzielen. Für dieses spezielle Beispiel war das nächste, das ich finden konnte df.groupby(['A', 'B']).sum(), aber es würde fehlschlagen, wenn ('A', 'B')Paare nicht eindeutig sind.
Eric Duminil

Antworten:


100

Einfach machen:

grouped_df = df.groupby('A')

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

Das funktioniert auch,

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

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

Für die selektive Schlüsselgruppierung: Fügen Sie die gewünschten Schlüssel wie key_list_from_gbfolgt in Folgendes ein gb.keys(): Beispiel:

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

1
Eine andere Option ist:for A in d['A'].unique(): print(A, df.query(f'A == "{A}"'))
tommy.carstensen

__iter __ () funktioniert auch. Es gibt den Generator zurück, der eine Sequenz von (Name, untergeordnetes Objekt) für jede Gruppe ergibt
Jeremy Z

Warum aber nicht eine Schleife machen key_list_from_gb?
Pfnuesel

66

Wenn Sie nur nach einer Möglichkeit suchen, es anzuzeigen, können Sie description () verwenden:

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

Dies gibt Ihnen einen ordentlichen Tisch.


6
Es ist ein ordentlicher Tisch, aber es ist nicht der gewünschte Tisch.
Eric Duminil

15

Ich habe bestätigt, dass sich das Verhalten von head()Änderungen zwischen Version 0.12 und 0.13 ändert. Das sieht für mich nach einem Fehler aus. Ich habe ein Problem erstellt .

Eine groupby-Operation gibt jedoch keinen nach Gruppen sortierten DataFrame zurück. Die .head()Methode ist hier etwas irreführend - es ist nur eine praktische Funktion, mit der Sie dfdas von Ihnen gruppierte Objekt (in diesem Fall ) erneut untersuchen können . Das Ergebnis groupbyist eine separate Art von Objekt, ein GroupByObjekt. Sie müssen apply, transformoder filteran einen Datenrahmen oder Serie zu kommen.

Wenn Sie nur nach den Werten in Spalte A sortieren möchten, sollten Sie verwenden df.sort('A').


4
Beachten Sie, dass headtatsächlich head(5)die ersten 5 Zeilen df.groupby('A').apply(lambda x: x)angezeigt werden. Richtiger ist es , den Frame anzuzeigen, was effektiv ein Durchgang ist. Ich nehme an, Sie könnten vielleicht eine pass()Methode haben.
Jeff

13

Eine weitere einfache Alternative:

for name_of_the_group, group in grouped_dataframe:
   print (name_of_the_group)
   print (group)

9

Eine andere einfache Alternative könnte sein:

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

6

Zusätzlich zu früheren Antworten:

Nehmen Sie Ihr Beispiel,

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

Dann einfach 1 Zeilencode

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

4

Vielen Dank an Surya für gute Einblicke. Ich würde seine Lösung bereinigen und einfach tun:

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

2

Sie können die groupBy-Daten nicht direkt per print-Anweisung sehen, aber Sie können sie durch Iteration über die Gruppe mit der for-Schleife sehen. Versuchen Sie diesen Code, um die Gruppe nach Daten zu sehen

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)

Sie erhalten eine Ausgabe, nachdem Sie dies als Groupby-Ergebnis versucht haben

Ich hoffe, es hilft


2

Rufen Sie list () für das GroupBy-Objekt auf

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

gibt Ihnen:

[('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)]

Ja, das braucht mehr Stimmen! Sie können dies auch tun, nachdem Sie das Objekt gruppiert haben. df_g = df.groupby ('A'), dann können Sie die Liste (df_g) aufrufen oder wenn Sie nur die erste Gruppenanrufliste (df_g) [0] möchten. Dies ist eine Sache, die ich an R über Python mag. In R müssen Sie nicht durch die meisten Objekte iterieren, um die Daten zu sehen, aber in Python müssen Sie einen Großteil des Objekts bearbeiten. Solche Prozesse zu finden ist erfrischend. Danke Elizabeth.
PVic

2

Wenn Sie in Jupyter Notebook Folgendes tun, wird eine schöne gruppierte Version des Objekts gedruckt. Die applyMethode hilft bei der Erstellung eines Multiindex-Datenrahmens.

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

Ausgabe:

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

Wenn Sie möchten, dass die bySpalte (n) nicht in der Ausgabe angezeigt werden, lassen Sie die Spalte (n) einfach so fallen.

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

Ausgabe:

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

Hier bin ich mir nicht sicher, warum .iloc[:]nicht statt [:]am Ende funktioniert . Wenn es also in Zukunft Probleme aufgrund von Updates (oder derzeit) gibt, .iloc[:len(a)]funktioniert dies auch.


0

Ich habe einen kniffligen Weg gefunden, nur für ein Brainstorming, siehe 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)

die Ausgabe:

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

Die Profis sind so einfach zu drucken, da sie anstelle von Groupby Object einen Datenrahmen zurückgeben. Und die Ausgabe sieht gut aus. Der Nachteil ist, dass eine Reihe redundanter Daten erstellt werden.


0

In 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

Auf interaktivere Weise


-2

um alle (oder beliebig viele) Zeilen des gruppierten df zu drucken:

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

grouped_df = df.group(['var1', 'var2'])
print(grouped_df)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.