Pandas/NumPyコード読解パターン

Python/Pandas のコード読解を高速化する読み方。メソッドチェーンを段階解読。

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() の結果として正しいのはどれか。

  1. category, sum, mean の3列を持つDataFrame
  2. amount のSeries
  3. categoryのSeries
  4. MultiIndex の DataFrame
こたえを見る

正解: 1. category, sum, mean の3列を持つDataFrame

category, sum, mean の3列を持つDataFrame。 reset_index() でカテゴリがインデックスから列に戻り、agg(['sum','mean'])で2集計列が追加されます。

🔖 この記事の関連書籍

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