【Python】pandasのピボットテーブル(pivot_table)で高度なデータ集計を行う
データ分析を行う際、データの集計や変換は避けて通れない作業です。その中でも、pandasのpivot_tableは柔軟で強力な機能を持っています。このブログでは、pivot_tableを使った基本的な集計方法から、応用的な使い方までを中級者向けに解説します。
基本例:商品の売上を日付と商品ごとに集計
まずは、日付と商品の組み合わせごとに売上を合計する基本的な使い方を紹介します。
import pandas as pd
# サンプルデータ
data = {
'日付': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
'商品': ['A', 'B', 'A', 'B'],
'売上': [100, 200, 150, 250],
'数量': [2, 3, 1, 4]
}
df = pd.DataFrame(data)
# pivot_tableで売上合計を商品ごとに集計
pivot = pd.pivot_table(df, values='売上', index='日付', columns='商品', aggfunc='sum', fill_value=0)
print(pivot)
# 出力結果
# 商品 A B
# 日付
# 2023-01-01 100 200
# 2023-01-02 150 250
解説:
- values=’売上’で集計対象を売上に指定。
- index=’日付’で行方向のインデックスを日付に設定。
- columns=’商品’で列方向を商品ごとに分類。
- aggfunc=’sum’で売上を合計。
- fill_value=0で欠損値を0に置き換え。
応用例:複数の集計と階層的なデータ構造
次に、地域ごと、月ごとに売上と数量を集計し、それぞれの合計と平均を計算します。
import pandas as pd
# サンプルデータ作成
data = {
'日付': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-02-01', '2023-02-02', '2023-02-03',
'2023-01-01', '2023-01-02', '2023-01-03', '2023-02-01', '2023-02-02', '2023-02-03'],
'地域': ['東', '東', '西', '西', '東', '西', '東', '西', '東', '西', '東', '東'],
'商品': ['A', 'B', 'A', 'A', 'B', 'B', 'B', 'A', 'A', 'B', 'A', 'B'],
'売上': [200, 300, 150, 400, 500, 300, 450, 200, 250, 300, 150, 400],
'数量': [3, 5, 2, 6, 8, 5, 7, 3, 4, 5, 2, 6]
}
df = pd.DataFrame(data)
# 日付をdatetime型に変換
df['日付'] = pd.to_datetime(df['日付'])
# 月列を追加
df['月'] = df['日付'].dt.to_period('M')
# pivot_tableで複数集計
define_pivot = pd.pivot_table(
df,
values=['売上', '数量'],
index=['地域', '月'], # 行:地域ごと、月ごと
columns='商品', # 列:商品ごと
aggfunc={'売上': ['sum', 'mean'], '数量': ['sum', 'mean']}, # 合計と平均を計算
fill_value=0 # 欠損値を0で補完
)
print(define_pivot)
# 出力結果
# 売上 数量
# sum mean sum mean
# 商品 A B A B A B A B
# 地域 月
# 東 2023-01 450 300 225 300 7 5 3.5 5.0
# 2023-02 150 500 150 500 2 8 2.0 8.0
# 西 2023-01 200 200 200 200 5 3 5.0 3.0
# 2023-02 400 300 400 300 6 5 6.0 5.0
解説:
- 複数の列(売上と数量)を集計。
- 複数の集計関数(合計と平均)を同時に指定。
- 行インデックスに地域と月を設定し、階層的に集計。
応用ポイント:階層をフラット化
結果の階層的な列をフラット化して見やすくすることもできます。
# フラット化 pivot_flat = define_pivot.copy() pivot_flat.columns = ['_'.join(col).strip() for col in define_pivot.columns.values] print(pivot_flat) # 出力結果 # 売上_mean_A 売上_mean_B 売上_sum_A 売上_sum_B 数量_mean_A 数量_mean_B 数量_sum_A 数量_sum_B # 地域 月 # 東 2023-01 225.0 375.0 450 750 3.5 6.0 7 12 # 2023-02 150.0 450.0 150 900 2.0 7.0 2 14 # 西 2023-01 175.0 0.0 350 0 2.5 0.0 5 0 # 2023-02 400.0 300.0 400 600 6.0 5.0 6 10
まとめ
pandasのpivot_tableは、データを柔軟に集計・変換する強力な機能です。本記事では基本的な使い方から応用例まで解説しました。特に複数の集計関数や階層データの活用、フラット化のテクニックは、実務で役立つポイントです。これを活用して分析業務の効率をさらに高めましょう。
スポンサーリンク