クロス集計に欠かせないのがピボットテーブルですが、pandasのピボットテーブルは合計、平均以外にも複雑な計算ができます。ですが、集計方法を指定する際にラムダ式もしくは関数オブジェクトを使うため、初見だと少し戸惑うかもしれません。
pivot_tableメソッド
DataFrameのpivot_tableメソッドでピボットテーブルを生成することができます。まずはサンプルから見てください。カテゴリーとタグがつけられたデータに何らかの値が付与されているデータの合計を集計してみます。
import pandas as pd df = pd.DataFrame([['cate1', 'tag1', 4], ['cate2', 'tag1', 10], ['cate1', 'tag2', 5], ['cate3', 'tag3', 5], ['cate2', 'tag3', 5]], columns=['category', 'tag', 'value']) # categoryとtagと値 # category tag value # 0 cate1 tag1 4 # 1 cate2 tag1 10 # 2 cate1 tag2 5 # 3 cate3 tag3 5 # 4 cate2 tag3 5 # 合計をクロス集計する df.pivot_table(index=['category'], columns=['tag'], values='value', fill_value=0, aggfunc=lambda x: sum(x)) # tag tag1 tag2 tag3 # category # cate1 4 5 0 # cate2 10 0 5 # cate3 0 0 5 #
何をしているのかはなんとなく解ると思います。pivot_tableで指定する引数は以下の通りです。
- index:縦の集計項目を指定します。複数指定することができます。
- columns:縦の集計項目を指定します。複数指定することができます。
- values:集計対象の値の項目を指定します。
- fill_value:NaNを何で埋めるかです。サンプルでは0埋めしています。
- aggfunc:集計関数を指定します。
さて、最後のaggfuncが少しわかりづらいですね。ここにシーケンスに対して処理を行うラムダ式か関数オブジェクトを指定します。
例えば、個数、平均、標準偏差を集計する場合、以下のように記述します。(データが少し適当すぎましたね(汗)適宜数字をいじって試してみてください。)
# 個数 df.pivot_table(index=['category'], columns=['tag'], values='value', fill_value=0, aggfunc=lambda x: len(x)) # 平均 df.pivot_table(index=['category'], columns=['tag'], values='value', fill_value=0, aggfunc=lambda x: np.average(x)) # 標準偏差 df.pivot_table(index=['category'], columns=['tag'], values='value', fill_value=0, aggfunc=lambda x: np.std(x))
このaggfuncをカスタマイズすると、複雑な集計が可能となりますが、最初は難しく感じますね。ラムダ式か関数オブジェクトについて不安な場合はこちらとこちらを参考にしてください。