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