Wie kann man einen gruppierten Pandas-Datenrahmen durchlaufen?

146

DataFrame:

  c_os_family_ss c_os_major_is l_customer_id_i
0      Windows 7                         90418
1      Windows 7                         90418
2      Windows 7                         90418

Code:

print df
for name, group in df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)):
    print name
    print group

Ich versuche nur, die aggregierten Daten zu durchlaufen, aber ich erhalte die Fehlermeldung:

ValueError: Zu viele Werte zum Entpacken

@EdChum, hier ist die erwartete Ausgabe:

                                                    c_os_family_ss  \
l_customer_id_i
131572           Windows 7,Windows 7,Windows 7,Windows 7,Window...
135467           Windows 7,Windows 7,Windows 7,Windows 7,Window...

                                                     c_os_major_is
l_customer_id_i
131572           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...
135467           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

Die Ausgabe ist nicht das Problem, ich möchte jede Gruppe durchlaufen.

Tjorriemorrie
quelle

Antworten:

224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) gibt bereits einen Datenrahmen zurück, sodass Sie die Gruppen nicht mehr durchlaufen können.

Allgemein:

  • df.groupby(...)GroupByGibt ein Objekt zurück (ein DataFrameGroupBy oder SeriesGroupBy), und mit diesem können Sie die Gruppen durchlaufen (wie in den Dokumenten hier erläutert ). Sie können so etwas tun wie:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
    
  • Wenn Sie eine Funktion auf dem groupby, in Ihrem Beispiel gelten df.groupby(...).agg(...)(dies kann aber auch sein transform, apply, mean, ...), Sie kombinieren das Ergebnis der Anwendung der Funktion auf die verschiedenen Gruppen zusammen in einem Datenrahmen (die Anwendung und Schritt des Mähdreschers 'Split-Apply-Combine'-Paradigma von Groupby). Das Ergebnis ist also immer wieder ein DataFrame (oder eine Serie, abhängig von der angewendeten Funktion).

Joris
quelle
49

Hier ist ein Beispiel für das Durchlaufen einer pd.DataFramenach Spalten gruppierten Gruppe atable. Für einen Beispiel-Anwendungsfall werden "create" -Anweisungen für eine SQL-Datenbank in der forSchleife generiert :

import pandas as pd

df1 = pd.DataFrame({
    'atable':     ['Users', 'Users', 'Domains', 'Domains', 'Locks'],
    'column':     ['col_1', 'col_2', 'col_a', 'col_b', 'col'],
    'column_type':['varchar', 'varchar', 'int', 'varchar', 'varchar'],
    'is_null':    ['No', 'No', 'Yes', 'No', 'Yes'],
})

df1_grouped = df1.groupby('atable')

# iterate over each group
for group_name, df_group in df1_grouped:
    print('\nCREATE TABLE {}('.format(group_name))

    for row_index, row in df_group.iterrows():
        col = row['column']
        column_type = row['column_type']
        is_null = 'NOT NULL' if row['is_null'] == 'NO' else ''
        print('\t{} {} {},'.format(col, column_type, is_null))

    print(");")
Andrei Sura
quelle
8
Vielen Dank für den Nachweis, dass Sie eine Person groupmit iterieren können for row, data in group.iterrows()!
Tatlar
16

Sie können die Indexwerte durchlaufen, wenn Ihr Datenrahmen bereits erstellt wurde.

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
Khiner
quelle