pandas の pivot_table でクロス集計表を作る

Excel のピボットテーブルに相当する機能が pandas にもあります。pivot_table を使えば、行と列でグループ化したクロス集計表を簡単に作成できます。

基本的な使い方

売上データを例に見てみましょう。

import pandas as pd

df = pd.DataFrame({
    'year': [2023, 2023, 2023, 2024, 2024, 2024],
    'product': ['A', 'B', 'A', 'A', 'B', 'A'],
    'sales': [100, 200, 150, 120, 180, 200]
})

result = pd.pivot_table(df, values='sales', index='year', columns='product')
print(result)

このコードでは、行に year、列に product を配置し、sales の平均値を表示しています。デフォルトの集計関数は mean です。

集計関数を変更する

aggfunc パラメータで集計関数を変更できます。

# 合計
pd.pivot_table(df, values='sales', index='year', columns='product', aggfunc='sum')

# 件数
pd.pivot_table(df, values='sales', index='year', columns='product', aggfunc='count')

# 最大値
pd.pivot_table(df, values='sales', index='year', columns='product', aggfunc='max')

複数の集計を同時に行うこともできます。

pd.pivot_table(df, values='sales', index='year', columns='product', 
               aggfunc=['sum', 'mean', 'count'])

欠損値を埋める

データの組み合わせによっては NaN が発生します。fill_value で埋める値を指定できます。

pd.pivot_table(df, values='sales', index='year', columns='product', 
               aggfunc='sum', fill_value=0)

複数の行・列でグループ化する

index や columns にリストを渡すと、複数の項目でグループ化できます。

df = pd.DataFrame({
    'year': [2023, 2023, 2024, 2024],
    'quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
    'region': ['East', 'East', 'West', 'West'],
    'sales': [100, 200, 150, 180]
})

pd.pivot_table(df, values='sales', index=['year', 'quarter'], columns='region')

小計・総計を追加する

margins=True を指定すると、行と列の合計が追加されます。

pd.pivot_table(df, values='sales', index='year', columns='product', 
               aggfunc='sum', margins=True, margins_name='Total')

Excel のピボットテーブルで「総計」を表示するのと同じ機能です。

pivot と pivot_table の違い

pandas には pivot という似た関数もあります。

pivot

単純にデータを縦持ちから横持ちに変換する。集計は行わない。重複があるとエラーになる。

pivot_table

集計しながら変換する。重複があっても集計関数で処理される。より柔軟。

# pivot は集計なしで変換(重複があるとエラー)
df_unique = pd.DataFrame({
    'year': [2023, 2024],
    'product': ['A', 'A'],
    'sales': [100, 150]
})
df_unique.pivot(index='year', columns='product', values='sales')

基本的には pivot_table を使っておけば間違いありません。データの集計レポートを作成するときに重宝する機能です。