Kaggle Tutorial

pandas 基礎 II — groupby・結合・pivot・apply

groupby による集計、merge/join での結合、pivot_table、apply/map による変換を学びます。

groupby:カテゴリごとの集計#

groupby は「分割 → 集計 → 結合(split-apply-combine)」を一手で行います。 カテゴリごとの傾向を見る EDA の主役です。

import pandas as pd

df = pd.read_csv("/kaggle/input/titanic/train.csv")

# 客室クラスごとの生存率
df.groupby("Pclass")["Survived"].mean()

# 複数キー・複数集計
df.groupby(["Pclass", "Sex"]).agg(
    survival_rate=("Survived", "mean"),
    count=("Survived", "size"),
)

agg に「新しい列名=(対象列, 集計関数)」を渡すと、結果が読みやすくなります。

merge / join:表の結合#

複数のテーブルを共通キーで結合します。SQL の JOIN に相当します。

# 乗客テーブルに、客室クラスごとの平均運賃を結合
fare_by_class = (
    df.groupby("Pclass")["Fare"].mean().rename("fare_mean").reset_index()
)
merged = df.merge(fare_by_class, on="Pclass", how="left")

how で結合方法を選びます。欠損を増やしたくない特徴量結合では how="left" が基本です。

注意

結合キーに重複があると行数が意図せず増えます(行の水増し)。 merge の前後で shape を確認し、想定どおりの行数かをチェックしましょう。

pivot_table:クロス集計#

行・列の 2 軸でクロス集計します。Excel のピボットテーブルと同じ発想です。

df.pivot_table(
    index="Pclass", columns="Sex", values="Survived", aggfunc="mean"
)

apply / map:要素・行ごとの変換#

ベクトル化で書けない複雑な変換は apply、値の置換は map を使います。

# 敬称(Title)を名前から抽出
df["Title"] = df["Name"].apply(lambda s: s.split(",")[1].split(".")[0].strip())

# カテゴリを数値へ写像
df["Sex_code"] = df["Sex"].map({"male": 0, "female": 1})

ヒント

apply は行ごとに Python 関数を呼ぶため低速です。map の辞書置換や、 df["a"] + df["b"] のようなベクトル化で書けないかを先に検討しましょう。

次のステップ#

次は matplotlib / seaborn を使ったデータ可視化に進みます。