Come eseguire il loop su frame di dati Pandas raggruppati?


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

Codice:

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

Sto cercando di eseguire il ciclo dei dati aggregati, ma viene visualizzato l'errore:

ValueError: troppi valori da decomprimere

@EdChum, ecco l'output previsto:

                                                    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           ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,...

L'output non è il problema, vorrei passare in rassegna ogni gruppo.

Risposte:


224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) restituisce già un frame di dati, quindi non è più possibile eseguire il loop sui gruppi.

In generale:

  • df.groupby(...)restituisce un GroupByoggetto (un DataFrameGroupBy o SeriesGroupBy) e, con questo, è possibile scorrere i gruppi (come spiegato nei documenti qui ). Puoi fare qualcosa del tipo:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
  • Quando si applica una funzione sul GroupBy, nel tuo esempio df.groupby(...).agg(...)(ma questo può anche essere transform, apply, mean, ...), si combinano il risultato dell'applicazione della funzione ai diversi gruppi in un unico dataframe (l'applicare e combinare fase del paradigma 'split-applica-combina' di groupby). Quindi il risultato di questo sarà sempre un DataFrame (o una serie a seconda della funzione applicata).


50

Ecco un esempio di iterazione su un pd.DataFrameraggruppato per colonna atable. Per un esempio di esempio, nel forciclo vengono generate istruzioni "create" per un database SQL :

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

8
Grazie per aver dimostrato che puoi iterare attraverso un individuo groupusando for row, data in group.iterrows()!
tatlar,

16

Puoi scorrere i valori dell'indice se il tuo frame di dati è già stato creato.

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.