Pandas Merge & Join:SQL風ジョインを正しく使う
Updated on
テーブル結合はミスが多い領域です。キーがずれると行が増えたり消えたりし、how="inner" の乱用や validate・indicator の未使用が原因になります。
PASの流れ:
- 問題: キー不一致で行が倍増したり欠落したりする。
- あおり: サフィックス衝突、予期しない直積、欠損行の調査は時間を浪費する。
- 解決: キーを明示し、適切な
howを選び、validateとindicatorで早めに検証する。
ジョイン早見表
how | 左を保持? | 右を保持? | 典型用途 |
|---|---|---|---|
inner | ✅ マッチのみ | ✅ マッチのみ | 共通部分 |
left | ✅ 全件 | 🚫 マッチのみ | 左テーブルを補完 |
right | 🚫 マッチのみ | ✅ 全件 | 右を補完(まれ。通常は入れ替える) |
outer | ✅ 全件 | ✅ 全件 | 全結合。欠損は NaN |
サンプルデータ
import pandas as pd
orders = pd.DataFrame({
"order_id": [1, 2, 3],
"customer_id": [100, 101, 102],
"amount": [50, 80, 60],
})
customers = pd.DataFrame({
"customer_id": [100, 101, 103],
"name": ["Ada", "Ben", "Cara"],
"segment": ["pro", "basic", "pro"],
})カラムキーでの基本 merge
result = orders.merge(
customers,
on="customer_id",
how="left",
validate="many_to_one", # ディメンション想定
indicator=True, # カバレッジ確認
)validateは想定外のカーディナリティを検出(many_to_many警告に注意)。indicatorは_merge列でleft_only/right_only/bothを示す。suffixes=("_order", "_cust")で重複カラム名を回避。
キー名が異なる場合
payments = pd.DataFrame({
"cust_id": [100, 100, 103],
"last_payment": ["2025-05-20", "2025-05-27", "2025-05-21"],
})
orders.merge(
payments,
left_on="customer_id",
right_on="cust_id",
how="left",
)インデックスベースの join
customers_idx = customers.set_index("customer_id")
orders.join(customers_idx, on="customer_id", how="left")- 右テーブルのキーがインデックスにある場合、
.joinが便利。 - マルチインデックスでは
on=["level_0", "level_1"]などで揃える。
重複と衝突への対処
# マージ前に重複キーを確認
dupes = customers["customer_id"].value_counts()
problem_keys = dupes[dupes > 1]
# マージ後の意図しない爆発を検知
exploded = orders.merge(customers, on="customer_id", how="inner", validate="many_to_many")many_to_oneを想定して行数が増えたら重複を確認。- 必要ならディメンションを
drop_duplicates(subset=keys)で整理。
複数メトリクスをまとめてマージ
agg = (
orders.groupby("customer_id", as_index=False)
.agg(total_amount=("amount", "sum"), orders_count=("order_id", "count"))
)
customers.merge(agg, on="customer_id", how="left")集計してからマージすると生データへの連続ジョインを減らせる。
デバッグチェックリスト
| 症状 | 確認ポイント |
|---|---|
| 行数が急増 | _merge を確認し、validate を期待カーディナリティに設定。 |
| マージ後に行が欠落 | how="left" や how="outer" で確認。キーの dtype を揃える。 |
| マッチが間違う | キーの dtype を一致させる(文字列と整数の混在など)。 |
| 列名が上書きされる | 明示的に suffixes を指定する。 |
関連ガイド
まとめ
- 目的に合わせて join を選ぶ。補完なら
leftが安全。 - 問題を早期に見つけるには
validate、indicator、suffixesを使う。 - キーと dtype を揃え、ディメンションを重複排除して爆発を防ぐ。