pandas入門 ピボットテーブル

クロス集計に欠かせないのがピボットテーブルですが、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をカスタマイズすると、複雑な集計が可能となりますが、最初は難しく感じますね。ラムダ式か関数オブジェクトについて不安な場合はこちらこちらを参考にしてください。