aggで一気に
このレッスンでできるようになること。agg を使って、合計と平均と件数を1回の集計でまとめて出せるようになります。
ここまでは1つの集計につき1回 groupby を書いていました。合計も平均も件数も欲しいなら3回書くことになります。同じデータを3周するので無駄ですし、あとで軸を変えたくなったとき3か所を直すことになります。agg は、束ねたあとに掛けたい関数をまとめて指定する道具です。
Python
result = df.groupby("店舗")["金額"].agg(["sum", "mean", "count"])こう書くと、行が店舗、列が sum と mean と count の表が1回で得られます。関数名は文字列で並べます。列に名前を付けたいときは辞書やキーワード引数を使う書き方もありますが、まずはこの文字列のリストの形を確実に使えるようにします。
agg が返すのは DataFrame です。Series ではありません。1つの列に対して複数の関数を掛けた結果なので、縦にグループ、横に統計量が並びます。値を取り出すときは result.loc["渋谷店", "sum"] のように行と列を指定します。
ここでも型に注意が必要です。sum と count は int64、mean は float64 になります。辞書にして返すときは、それぞれ int() と round(float(...), 1) に直します。1つの表から取り出した値でも列ごとに型が違うことは、pandas を使ううえで何度も出会う場面です。
合計と平均と件数を同時に見ると、店舗の性格が読めます。合計が同じでも、件数が多くて平均が低い店は「たくさん売れているが単価が低い」、逆なら「客数は少ないが高額品が動いている」と判断できます。打ち手はまったく変わります。数字を並べるだけでなく、この読み分けまで持っていくのが7章の準備になります。
要件
- groupby("店舗")["金額"].agg(["sum", "mean", "count"]) の形で1回にまとめる
- sum と count は int()、mean は round(float(...), 1) にする
- 同じ集計を3回書かない
- 戻り値は店舗名をキーとする入れ子の辞書にする
入出力例
stats_by_store("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-08,渋谷店,木製カッティングボード,調理器具,1,4200
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
") → {"横浜店":{"count":1,"mean":7800,"sum":7800},"渋谷店":{"count":2,"mean":3900,"sum":7800}}
stats_by_store("売上日,店舗,商品名,カテゴリ,数量,金額
2026-02-04,大宮店,積み重ね収納ボックス,収納,3,4500
2026-02-05,大宮店,布製収納バスケット,収納,2,3000
2026-02-06,大宮店,白磁のマグカップ,食器,5,9000
") → {"大宮店":{"count":3,"mean":5500,"sum":16500}}