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)