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']) の結果として正しいのはどれか。
- amount列のsumとmeanの2列を持つ、categoryをインデックスとするDataFrame
- category列の合計値1つだけのSeries
- 全カラムのsumとmean
- エラー
こたえを見る
正解: 1. amount列のsumとmeanの2列を持つ、categoryをインデックスとするDataFrame
amount列のsumとmeanの2列を持つ、categoryをインデックスとするDataFrame。 categoryでグループ化し、amount列に対してsumとmeanの2集計を計算します。 結果はDataFrame、行インデックスはcategoryです。