分析において、データのカテゴリ分けや、それぞれのグループに対する関数の適用は、集約や変換と呼ばれる。

リレーショナルデータベース(RDB)を使えば、データの連結や集約、変換などを簡単に行えるが、ある程度の制約がある。

しかしPython、pandasを使うことで、より複雑なグループ演算をおこなうことができる。

今回は集約の基本的な方法として、groupbyメソッドについて紹介する。

groupbyメソッドを使って集約をおこなう

pandasのgroupbyメソッドを使うと簡単にデータの集約をおこなえる。

サンプルのデータフレームを集約する例を見ていこう。

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  0.128896  1.469601
# 1    a  two -0.124924 -0.179375
# 2    b  one -0.970063 -2.151981
# 3    b  two  0.349895  0.158248
# 4    a  one  1.414753  2.018212

サンプルデータフレームの用意ができたら、次はkey1ラベルでデータをグループ化する。

grouped = df.groupby(df['key1'])

groupbyメソッドを実行しただけでは特に何も出力されないので、グループ化したオブジェクトに対し集約処理を実行する。

今回はdata1の平均値を計算してみよう。

grouped.mean()
#          data1     data2
# key1                    
# a     0.472908  1.102813
# b    -0.310084 -0.996866

二つのキーを使ってグループ化する

groupbyメソッドの引数には複数のキーを指定することもできる。

grouped2 = df.groupby([df['key1'], df['key2']])
grouped2.mean()
#               data1     data2
# key1 key2                    
# a    one   0.771825  1.743907
#      two  -0.124924 -0.179375
# b    one  -0.970063 -2.151981
#      two   0.349895  0.158248

なお、引数に指定するキーは以下のように列名を直接渡しても同じ結果が得られる。

grouped2 = df.groupby(['key1', 'key2'])

sizeメソッド

groupbyメソッドにより取得したGroupByオブジェクトには、サイズ情報をシリーズとして返すsizeメソッドが用意されている。

grouped2.size()
# key1
# a    3
# b    2
# dtype: int64