ピボットテーブル
このレッスンでできるようになること。pivot_table を使って、店舗を縦、月を横に並べたマトリクスの集計表を作れるようになります。
前回の2軸 groupby は、結果が縦に長い形でした。3店舗×6ヶ月なら18行が縦に並びます。これは機械には読みやすい形ですが、人が見比べるには向きません。人が見るなら、店舗を行、月を列にした格子の表のほうが圧倒的に読みやすいです。この縦横の並べ替えを1行でやってくれるのが pivot_table です。
売上CSVには月の列がありません。3章で覚えたとおり、売上日を日付型にしてから月を取り出します。
Python
df["売上日"] = pd.to_datetime(df["売上日"])
df["月"] = df["売上日"].dt.month
table = df.pivot_table(index="店舗", columns="月", values="金額", aggfunc="sum")引数の役割ははっきり分かれています。index が縦の軸、columns が横の軸、values が集計する数値の列、aggfunc がその集計方法です。aggfunc を省くと平均になるので、合計が欲しいときは必ず "sum" を明示してください。ここは事故が多い場所です。
もう1つ気をつける点が空白です。ある店舗のある月に売上が1件も無いと、そのマスは NaN になります。売上0と欠測は本来別の意味ですが、月次の売上表では0として扱いたい場面がほとんどです。その場合は fill_value=0 を渡します。これで NaN が消え、値も整数のまま扱えます。fill_value を渡さないと列全体が float になり、合計が 15000.0 のように表示される点も覚えておいてください。
出来上がった表は DataFrame なので、そのまま返さずに to_dict() で辞書にします。pivot_table の to_dict() は列を外側、行を内側にした入れ子の辞書を返します。行を外側にしたいときは to_dict(orient="index") を使います。どちらの向きが欲しいかを決めてから書くと迷いません。
この表が第4章の成果物の骨格になります。次の value_counts と合わせて、月次集計表を完成させます。
要件
- 売上日を to_datetime で日付型にしてから月を取り出す
- pivot_table の index は 店舗、columns は 月、values は 金額
- aggfunc は "sum" を明示する
- 売上の無いマスは fill_value=0 で0にする
- 内側のキーは月の数字を文字列にしたもの(例 1月なら "1")にする
入出力例
monthly_matrix("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-08,渋谷店,木製カッティングボード,調理器具,1,4200
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-02-06,横浜店,鉄のフライパン,調理器具,1,7800
") → {"横浜店":{"1":0,"2":7800},"渋谷店":{"1":7800,"2":16800}}
monthly_matrix("売上日,店舗,商品名,カテゴリ,数量,金額
2026-03-01,大宮店,積み重ね収納ボックス,収納,3,4500
2026-03-02,大宮店,布製収納バスケット,収納,2,3000
2026-04-01,横浜店,白磁のマグカップ,食器,4,7200
") → {"大宮店":{"3":7500,"4":0},"横浜店":{"3":0,"4":7200}}