pandasのgroupbyメソッドで取得したGroupByオブジェクトは、繰り返し処理をサポートしており、for文などでループ処理を実行することができる。
では早速サンプルとなるデータフレームを用意して、実行例を見ていこう。
Contents
サンプルデータフレームの用意
import pandas as pd import numpy as np df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'], 'key2': ['one', 'two', 'one', 'two', 'one'], 'data1': np.random.randn(5), 'data2': np.random.randn(5)}) # key1 key2 data1 data2 # 0 a one -1.155429 -0.044912 # 1 a two -0.607321 1.458413 # 2 b one -1.639389 1.146254 # 3 b two -0.493920 0.912570 # 4 a one -0.675757 -0.494751
GroupByオブジェクトでforループ処理を実行
GroupByオブジェクトの繰り返し処理では、グループの名前と、それに対応するデータの二つを含むタプルで構成されるシーケンスを生成する。
for name, group in df.groupby('key1'): print(name) print(group) print(group['data1'].mean()) print(group['data2'].sum()) print("\n") # a # key1 key2 data1 data2 # 0 a one -1.155429 -0.044912 # 1 a two -0.607321 1.458413 # 4 a one -0.675757 -0.494751 # -0.8128357020974613 # 0.9187501730845543 # b # key1 key2 data1 data2 # 2 b one -1.639389 1.146254 # 3 b two -0.493920 0.912570 # -1.0666543041776058 # 2.0588248587902713
複数のキーを扱う場合
複数のキーを扱う場合は、以下のように記述し、ループ処理で使用されるタプルに含まれる最初の要素はキー値のタプルになる。
for (k1, k2), group in df.groupby(['key1', 'key2']): print((k1, k2)) print(group) print("\n") # ('a', 'one') # key1 key2 data1 data2 # 0 a one -1.155429 -0.044912 # 4 a one -0.675757 -0.494751 # ('a', 'two') # key1 key2 data1 data2 # 1 a two -0.607321 1.458413 # ('b', 'one') # key1 key2 data1 data2 # 2 b one -1.639389 1.146254 # ('b', 'two') # key1 key2 data1 data2 # 3 b two -0.49392 0.91257
別の軸を設定する
groupbyメソッドによりグループ化されたオブジェクトは、デフォルトではaxis=0でグループ化されるが、別の軸に設定することもできる。
dtypeを使うことで、次のようにグループ化することが可能だ。
df.dtypes # key1 object # key2 object # data1 float64 # data2 float64 # dtype: object grouped = df.groupby(df.dtypes, axis=1) for dtype, group in grouped: print(dtype) print(group)