【Python】Pandasのpivot_tableでデータをクロス集計・集約する方法

目次

pivot_tableメソッドによるデータの要約

Pandasの pivot_table メソッドを使用すると、大量のデータを特定の切り口で整理し、クロス集計を行うことができます。Excelのピボットテーブル機能と同様に、行と列を指定してデータの平均や合計を算出する際に非常に強力なツールとなります。

主要なパラメータとその意味

pivot_table で頻繁に使用されるパラメータを以下の表にまとめます。

パラメータ意味
index行インデックスとして使用する列名。複数指定可能。
columns列インデックスとして使用する列名。複数指定可能。
values集計対象となる数値データの列名。
fill_value欠損値(NaN)が発生した場合に補完する値。
aggfunc集計方法を指定する関数(平均、合計など)。デフォルトは平均。

ピボットテーブルの作成例

ここでは、複数の倉庫における「商品の種類」と「配送先エリア」別の配送料金を管理するシナリオを想定したコードを作成します。

import pandas as pd
import numpy as np

# 物流データの定義
# 倉庫名(Warehouse)、商品種別(Product)、エリア(Area)、配送料(Shipping_Fee)
logistics_data = {
    "Warehouse": ["East", "East", "East", "West", "West", "West", "North", "North", "North"],
    "Product": ["Food", "Daily", "Daily", "Food", "Daily", "Food", "Food", "Daily", "Daily"],
    "Area": ["Tokyo", "Tokyo", "Osaka", "Osaka", "Tokyo", "Osaka", "Tokyo", "Osaka", "Tokyo"],
    "Shipping_Fee": [850, 600, 1200, 950, 700, 1100, 900, 1150, 650]
}

df = pd.DataFrame(logistics_data)

# pivot_tableを使用してクロス集計を実行
# 倉庫(Warehouse)を行、商品種別(Product)を列に配置し、配送料の平均を算出
# データが存在しない組み合わせは0で埋める
pivot_df = df.pivot_table(
    index="Warehouse",
    columns="Product",
    values="Shipping_Fee",
    fill_value=0,
    aggfunc=np.mean
)

print("--- 元の物流データ ---")
print(df)
print("\n--- 倉庫×商品種別の平均配送料(ピボットテーブル) ---")
print(pivot_df)

実行結果

上記のコードを実行すると、行と列が整理された集計結果が得られます。

--- 元の物流データ ---
  Warehouse Product   Area  Shipping_Fee
0      East    Food  Tokyo           850
1      East   Daily  Tokyo           600
2      East   Daily  Osaka          1200
3      West    Food  Osaka           950
4      West   Daily  Tokyo           700
5      West    Food  Osaka          1100
6     North    Food  Tokyo           900
7     North   Daily  Osaka          1150
8     North   Daily  Tokyo           650

--- 倉庫×商品種別の平均配送料(ピボットテーブル) ---
Product    Daily    Food
Warehouse               
East       900.0   850.0
North      900.0   900.0
West       700.0  1025.0

コードの解説と補足

  1. 集計の仕組み: aggfunc=np.mean を指定することで、同じ「倉庫」かつ同じ「商品種別」に該当するデータが複数ある場合、その平均値を算出しています。
  2. 欠損値の処理: fill_value=0 を設定することで、特定の組み合わせ(例:特定の倉庫に特定の商品が存在しない場合など)で計算結果がNaN(非数)になる箇所を、自動的に0として出力します。
  3. 柔軟な集約: aggfunc には np.sum(合計)や len(件数)、 np.max(最大値)など、用途に合わせた関数を指定することが可能です。

このように pivot_table を活用することで、複雑な生データからビジネス上の意思決定に必要な傾向を即座に抽出できるようになります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次