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 を使っておけば間違いありません。データの集計レポートを作成するときに重宝する機能です。