So drucken Sie ein Groupby-Objekt

Lesezeit: 5 Minuten

Benutzer-Avatar
Benutzer3465658

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 Datenrahmen gruppiert drucken?

Wenn ich mache:

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

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

             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 sowas 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 erhalte die korrekte Ausgabe mit print df.groupby('A').head(). Welche Panda-Version hast du?

    – Amit

    27. März 2014 um 15:06 Uhr


  • Ich habe gerade sowohl auf meinem Desktop als auch auf meinem Laptop auf 0.13.1 aktualisiert.

    – Benutzer3465658

    27. März 2014 um 15:14 Uhr

  • Wie wäre es, das Objekt direkt zu “listen()”? Und dann können Sie es als normale Datenstruktur manipulieren/drucken.

    – Tropenpinguin

    17. April 2018 um 7:48 Uhr

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

    – Eric Duminil

    29. Juli 2019 um 11:47 Uhr

  • Hallo. Kann ich wissen, wie man “eins”, “zwei”, “drei” nur in der Ausgabe druckt? Was ich meine, ist nur die Daten zu drucken, die wir gruppiert haben. Ich möchte diese Daten verwenden, um mein Kreisdiagramm zu beschriften.

    – xk derhaka

    12. November 2021 um 3:12 Uhr

Benutzer-Avatar
Surja

Einfach machen:

grouped_df = df.groupby('A')

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

Abschreibungshinweis: ix war in 0.20.0 veraltet

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 selektive Schlüsselgruppierung: Fügen Sie die gewünschten Schlüssel in das ein key_list_from_gbim Folgenden mit gb.keys(): Zum 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")

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

    – tommy.carstensen

    24. Mai 2017 um 10:10 Uhr


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

    – Jeremy Z

    27. April 2018 um 5:44 Uhr

  • Warum nicht überschleifen key_list_from_gb obwohl?

    – Pfnüssel

    11. September 2019 um 5:38 Uhr

Wenn Sie einfach nach einer Möglichkeit suchen, es anzuzeigen, können Sie “describe()” verwenden:

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

So erhalten Sie einen ordentlichen Tisch.

  • Es ist ein ordentlicher Tisch, aber es ist nicht der gewünschte Tisch.

    – Eric Duminil

    29. Juli 2019 um 10:08 Uhr

Zusätzlich zu früheren Antworten:

Nehmen wir Ihr Beispiel,

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

Dann einfacher 1-zeiliger Code

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

  • Clever, obwohl es besser wäre, .apply(display) zu verwenden, um eine schöne Formatierung zu erhalten.

    – set92

    22. Januar 2021 um 12:57 Uhr

  • Einfach importieren display aus Ipython.display dafür 🙂

    – Gajraj Singh Chouhan

    3. Juni 2021 um 7:35 Uhr


Wenn Sie in Jupyter Notebook wie folgt vorgehen, wird eine schöne gruppierte Version des Objekts gedruckt. Das apply -Methode 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 du willst by Spalte(n) nicht in der Ausgabe erscheinen, löschen Sie einfach die Spalte(n) wie folgt.

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[:] funktioniert nicht statt [:] Am Ende. Wenn es also in Zukunft aufgrund von Updates (oder derzeit) Probleme geben sollte, .iloc[:len(a)] funktioniert auch.

Ich bestätigte, dass das Verhalten von head() Änderungen zwischen Version 0.12 und 0.13. Das sieht für mich nach einem Bug aus. Ich habe eine erstellt Ausgabe.

Eine Groupby-Operation gibt jedoch keinen nach Gruppe sortierten DataFrame zurück. Das .head() -Methode ist hier etwas irreführend — es ist nur eine praktische Funktion, mit der Sie das Objekt erneut untersuchen können (in diesem Fall df), die Sie gruppiert haben. Das Ergebnis von groupby ist eine separate Art von Objekt, a GroupBy Objekt. Du musst apply, transformoder filter um zu einem DataFrame oder einer Serie zurückzukehren.

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

  • beachten Sie, dass head macht eigentlich head(5) Im Folgenden werden die ersten 5 Zeilen angezeigt, richtiger ist es, den Rahmen zu ‘zeigen’ df.groupby('A').apply(lambda x: x), was praktisch eine Durchgangsverbindung ist. Ich nehme an, Sie könnten eine haben pass() Methode evtl.

    – Jeff

    27. März 2014 um 17:30 Uhr

Benutzer-Avatar
Sumit Pokhrel

Eine weitere einfache Alternative:

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

  • beachten Sie, dass head macht eigentlich head(5) Im Folgenden werden die ersten 5 Zeilen angezeigt, richtiger ist es, den Rahmen zu ‘zeigen’ df.groupby('A').apply(lambda x: x), was praktisch eine Durchgangsverbindung ist. Ich nehme an, Sie könnten eine haben pass() Methode evtl.

    – Jeff

    27. März 2014 um 17:30 Uhr

Benutzer-Avatar
Surja

Eine andere einfache Alternative könnte auch sein:

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

1036430cookie-checkSo drucken Sie ein Groupby-Objekt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy