pandasのgroupbyメソッドで取得したGroupByオブジェクトは、繰り返し処理をサポートしており、for文などでループ処理を実行することができる。
では早速サンプルとなるデータフレームを用意して、実行例を見ていこう。
コンテンツ
サンプルデータフレームの用意
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)