はじめに
Excelでおなじみの「ピボットテーブル」。
pandasでも、同様の機能が pivot_table() を使うことで簡単に実現できます。
- グループごとの平均や合計を見たい
- 男女別・年齢別などでクロス集計したい
- 行と列で集計を並べて、見やすく比較したい
こういったニーズに応えてくれるのが pivot_table() です。
この記事では、基本構文から応用パターンまでを、やさしく・実例つきで解説します。
1. pivot_tableとは?何ができるの?
pivot_table() は、複数のカテゴリ変数に基づいて、数値データの集計を行うための関数です。
Excelのピボットテーブルと同じように、「行」「列」「値(集計対象)」を指定することで、自由にクロス集計を行えます。
2. 使用データ(例)
以下のような簡単な成績データを使って説明していきます:
| 名前 | 年齢 | 点数 |
|---|---|---|
| 太郎 | 20 | 88 |
| 花子 | 21 | 92 |
| 次郎 | 19 | 95 |
| さくら | 22 | 70 |
| 健 | NaN | 83 |
3. 基本構文:index・columns・valuesを指定するだけ!
pd.pivot_table(df, index="年齢", values="点数", aggfunc="mean")✔ 結果(年齢ごとの平均点):
点数
年齢
19 95.0
20 88.0
21 92.0
22 70.0index: 行にしたいカテゴリvalues: 集計する数値列aggfunc: 集計方法(平均: “mean”, 合計: “sum”, 件数: “count”など)
✅ 欠損値(NaN)は自動的に除外されます(必要なら
fill_valueで埋められます)
4. 列(columns)を追加してクロス集計!
たとえば、次のような性別データを追加してみます:
df["性別"] = ["男", "女", "男", "女", "男"]そして、性別ごとの平均点を年齢別に見たいときは?
pd.pivot_table(df, index="年齢", columns="性別", values="点数", aggfunc="mean")✔ 結果:
| 年齢 | 女 | 男 |
|---|---|---|
| 19 | NaN | 95 |
| 20 | NaN | 88 |
| 21 | 92 | NaN |
| 22 | 70 | NaN |
columnsに「性別」を指定することで、列ごとに分類された表になります。- 行×列でクロスされた形式になるため、見やすいカテゴリ比較表が作れます。
5. 複数列の同時集計(複数値・複数関数)
▶ 平均と最大を一度に表示
pd.pivot_table(df, index="性別", values="点数", aggfunc=["mean", "max"])結果:
mean max
性別
女 81.0 92
男 88.6667 95✅
aggfuncにリストで複数の関数を指定することも可能です。
6. 件数を集計したいとき:aggfunc=”count”
pd.pivot_table(df, index="性別", values="点数", aggfunc="count")結果:
点数
性別
女 2
男 3これは、「性別ごとの点数データの数(=人数)」を表しています。
7. NaN対策:fill_valueで空欄を0に
空欄が気になる場合は、fill_value を使って埋めることもできます。
pd.pivot_table(df, index="年齢", columns="性別", values="点数", aggfunc="mean", fill_value=0)❗ 特に、プレゼンやレポート用に表を出力する場合、NaNが多いと読みにくくなるので便利です。
8. pivot_tableとgroupbyの違い
| 機能 | pivot_table | groupby |
|---|---|---|
| クロス集計(列方向) | ✅ columnsで指定可能 | ❌ |
| 複数集計関数 | ✅ 複数aggfuncが自然に使える | ✅(やや構文が複雑) |
| 欠損値処理(fill_value) | ✅ 自動対応あり | ❌ |
groupby でも集計はできますが、「見やすさ」「柔軟性」では pivot_table に軍配が上がります。
✅ まとめ
pivot_table()は Excelユーザーに最も親しみやすいpandasの集計関数index,columns,values,aggfuncの4つを指定するだけでOK- 平均・合計・最大・件数など、さまざまな集計が一発で可能
fill_valueで空欄対応もできて、プレゼン資料にも使いやすい!

コメント