DS検定で必出のPython/Pandasコード読解。出力形状とメソッドチェーンの読み方。
Pandas のメソッドチェーンって、どこからどう読めばいいの?
上から順に1段ずつね。 各段で『何の形状(Series/DataFrame)・何の意味』を持つかを把握しながら追っていくのよ。
import pandas as pd
import numpy as np
# ▼ 問題例1: 各カテゴリの売上トップ3
result = (
df
.query('amount > 1000') # 1. 1000円超に絞る
.groupby('category') # 2. カテゴリで集計準備
.agg(total=('amount', 'sum'), # 3. 合計と件数を計算
count=('order_id', 'count'))
.sort_values('total', ascending=False) # 4. 合計の降順
.head(3) # 5. 上位3件
)
# 結果: カテゴリをインデックスに、total と count の2列を持つDataFrame
# ▼ 問題例2: pivot_table
pivot = df.pivot_table(
index='month', # 行軸: 月
columns='category', # 列軸: カテゴリ
values='amount', # 値: 金額
aggfunc='sum', # 集計: 合計
fill_value=0, # 欠損は0で埋める
)
# 結果: 月×カテゴリのクロス集計表
# ▼ 問題例3: NumPyの配列演算
X = np.random.randn(100, 5) # shape: (100, 5)
X_std = (X - X.mean(axis=0)) / X.std(axis=0)
# axis=0 = 列ごとの平均/std → ブロードキャストで標準化
# 結果: shape (100, 5) で各列が平均0・分散1
メソッドチェーン、慣れると気持ちよくなりますぅ〜♪
そうだね、各段が『フィルタ→集計→並び替え→絞り込み』みたいに目的を持っているんだ。 SQLの実行順序とよく似た発想だよ。
shape を意識するのって大事だよね。
# ▼ 問題例4: shape を意識した変換
# 元: shape (1000, 4) の DataFrame, 列= [category(str), amount(int), date(datetime), region(str)]
result = (
df
.assign(month=lambda x: x['date'].dt.to_period('M')) # month列追加
.groupby(['month', 'region']) # 2軸集計
['amount'] # 値列を選択
.agg(['sum', 'mean', 'count']) # 3つの集計
.reset_index() # MultiIndex を列に戻す
)
# shape: (月数 × 地域数, 5) ※ month, region, sum, mean, count
# ▼ 問題例5: apply での行レベル処理
df['grade'] = df.apply(
lambda row: 'High' if row['amount'] >= 50000
else ('Mid' if row['amount'] >= 10000 else 'Low'),
axis=1
)
# axis=1 で各行に lambda を適用、新列 grade を追加
DS検定の Pandas 読解では『.agg()と.apply()の違い』『axis=0/1』『loc/iloc』『groupbyの結果がSeriesかDataFrameか』が頻出なのよ。
本番では1問あたり1〜2分で読み切る速度を目指そう。 出力の shape と意味を瞬時に把握できるよう訓練しておきたいね。
確認クイズ
df.groupby('category')['amount'].agg(['sum', 'mean']).reset_index() の結果として正しいのはどれか。
- category, sum, mean の3列を持つDataFrame
- amount のSeries
- categoryのSeries
- MultiIndex の DataFrame
こたえを見る
正解: 1. category, sum, mean の3列を持つDataFrame
category, sum, mean の3列を持つDataFrame。 reset_index() でカテゴリがインデックスから列に戻り、agg(['sum','mean'])で2集計列が追加されます。