Pandas 集計(groupby・pivot_table・apply)

Pandas集計操作の核。groupby/pivot_table/applyを実務級コードで完全マスター。

Pandasの核、集計操作。groupby・pivot_tableで実務級のデータ分析を行います。

白峰 リリ(普段) 白峰 リリ

Pandas で SQL の GROUP BY 的なことってできるの?

神楽 モニカ 先生(笑顔) 神楽 モニカ 先生

もちろん、groupbyメソッドで同じことができるわ。

紅林 かえで(普段) 紅林 かえで

基本パターンは df.groupby('列').agg(...) ね。
集計関数として 'sum'・'mean'・'count'・'min'・'max' などを指定する形よ。

import pandas as pd

df = pd.read_csv('sales.csv')
# columns: order_id, customer_id, category, amount, ordered_at

# (1) シンプルなgroupby + 集計
category_summary = df.groupby('category')['amount'].sum()
# Series が返る (category がインデックス)

# (2) 複数の集計
summary = df.groupby('category').agg(
    total_sales=('amount', 'sum'),
    avg_amount=('amount', 'mean'),
    count=('order_id', 'count'),
)
summary = summary.sort_values('total_sales', ascending=False)

# (3) ピボットテーブル(2軸クロス集計)
pivot = df.pivot_table(
    index='customer_id',
    columns='category',
    values='amount',
    aggfunc='sum',
    fill_value=0,
)
藍沢 しずく(普段) 藍沢 しずく

pivot_tableって Excel のピボットと同じですかぁ?

紅林 かえで(普段) 紅林 かえで

そう、行軸・列軸・値・集計関数を指定して、2次元のクロス集計表を作るの。
顧客×カテゴリの売上マトリックスなんかも一発で作れるわ。

白峰 リリ(普段) 白峰 リリ

じゃあ apply はどんなときに使うの?

# (4) apply: 任意の関数を各行/列に適用
def grade(row):
    if row['amount'] >= 50000:
        return 'Premium'
    elif row['amount'] >= 10000:
        return 'Standard'
    return 'Basic'

df['grade'] = df.apply(grade, axis=1)   # axis=1 = 各行に適用

# (5) lambdaで簡潔に
df['amount_log'] = df['amount'].apply(lambda x: np.log1p(x))

# (6) グループごとの apply
df['amount_rank_in_category'] = df.groupby('category')['amount'] \
    .rank(method='dense', ascending=False)
神楽 モニカ 先生(普段) 神楽 モニカ 先生

apply は柔軟だけど低速なのよ。
シンプルな演算なら groupby+agg やベクトル化操作の方が速いから、大規模データでは使い分けを意識してね。

紅林 かえで(普段) 紅林 かえで

DS検定★ コード読解では (1)groupby+agg の集計結果がどうなるか、(2)pivot_table の行・列・値の対応、(3)applyで適用される関数の意味、このあたりが頻出ね。

藍沢 しずく(笑顔) 藍沢 しずく

実例で覚えますぅ♪

確認クイズ

df.groupby('category')['amount'].agg(['sum', 'mean']) の結果として正しいのはどれか。

  1. amount列のsumとmeanの2列を持つ、categoryをインデックスとするDataFrame
  2. category列の合計値1つだけのSeries
  3. 全カラムのsumとmean
  4. エラー
こたえを見る

正解: 1. amount列のsumとmeanの2列を持つ、categoryをインデックスとするDataFrame

amount列のsumとmeanの2列を持つ、categoryをインデックスとするDataFrame。 categoryでグループ化し、amount列に対してsumとmeanの2集計を計算します。 結果はDataFrame、行インデックスはcategoryです。

紅林かえで、白峰リリが冬のリンクでアイススケートを楽しむ様子

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。