Skip to content

Pandas Merge & Join:SQL風ジョインを正しく使う

Updated on

テーブル結合はミスが多い領域です。キーがずれると行が増えたり消えたりし、how="inner" の乱用や validateindicator の未使用が原因になります。

PASの流れ:

  • 問題: キー不一致で行が倍増したり欠落したりする。
  • あおり: サフィックス衝突、予期しない直積、欠損行の調査は時間を浪費する。
  • 解決: キーを明示し、適切な how を選び、validateindicator で早めに検証する。

ジョイン早見表

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 が安全。
  • 問題を早期に見つけるには validateindicatorsuffixes を使う。
  • キーと dtype を揃え、ディメンションを重複排除して爆発を防ぐ。