分析において、データのカテゴリ分けや、それぞれのグループに対する関数の適用は、集約や変換と呼ばれる。
リレーショナルデータベース(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