¿Cómo hacer un bucle en el dataframe agrupado de Pandas?

Marco de datos:

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

Código:

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

Estoy tratando de pasar por encima de los datos agregados, pero me sale el error:

ValueError: demasiados valores para descomprimir

@EdChum, aquí está el resultado esperado:

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

La salida no es el problema, deseo hacer un bucle en cada grupo.

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) ya devuelve un dataframe, por lo que ya no puede recorrer los grupos.

En general:

  • df.groupby(...) devuelve un objeto GroupBy (un DataFrameGroupBy o SeriesGroupBy), y con esto, puede recorrer los grupos (como se explica en los documentos aquí ). Puedes hacer algo como:

     grouped = df.groupby('A') for name, group in grouped: ... 
  • Cuando aplica una función en el groupby, en su ejemplo df.groupby(...).agg(...) (pero esto también puede ser transform , apply , mean , …), combina el resultado de aplicar la función a los diferentes grupos juntos en un dataframe (el paso de aplicar y combinar del paradigma ‘dividir-aplicar-combinar’ de groupby). Por lo tanto, el resultado de esto siempre será nuevamente un dataframe (o una serie según la función aplicada).

Aquí hay un ejemplo de iteración sobre un pd.DataFrame agrupado por la columna atable . Para un caso de uso de ejemplo, las declaraciones de “creación” para una base de datos SQL se generan dentro del bucle for :

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

Puede iterar sobre los valores del índice si su dataframe ya se ha creado.

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