グループ化されたPandasデータフレームをループする方法は?


146

データフレーム:

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

コード:

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

集約されたデータをループするだけですが、エラーが発生します。

ValueError:展開するには値が多すぎます

@EdChum、これが予想される出力です。

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

出力は問題ではありません。すべてのグループをループしたいと思います。

回答:


224

df.groupby('l_customer_id_i').agg(lambda x: ','.join(x)) はすでにデータフレームを返すため、グループをループすることはできません。

一般に:

  • df.groupby(...)GroupByオブジェクト(DataFrameGroupByまたはSeriesGroupBy)を返します。これにより、グループを反復処理できます(こちらのドキュメント説明されています)。次のようなことができます:

    grouped = df.groupby('A')
    
    for name, group in grouped:
        ...
    
  • あなたはあなたの例では、GROUPBYに関数を適用する場合df.groupby(...).agg(...)(これはまたすることができtransformapplymean...、)、あなたはコンバインの結果適用 1つのデータフレームの(適用と組み合わせるステップで一緒に異なるグループに機能をgroupbyの「split-apply-combine」パラダイム)。したがって、この結果は常にDataFrame(または適用された関数に応じてSeries)になります。


50

これはpd.DataFrame、列でグループ化された反復処理の例ですatable。サンプルユースケースでは、SQLデータベースの「作成」ステートメントが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(");")

8
groupを使用して個人を反復できることを示してくれてありがとうfor row, data in group.iterrows()
tatlar 2018

16

データフレームがすでに作成されている場合は、インデックス値を反復処理できます。

df = df.groupby('l_customer_id_i').agg(lambda x: ','.join(x))
for name in df.index:
    print name
    print df.loc[name]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.