Skip to content

Pandas Merge & Join: SQL 스타일 조인을 제대로 쓰기

Updated on

조인은 실수하기 쉽습니다. 키가 어긋나면 행이 폭증하거나 사라집니다. how="inner" 남용, validate/indicator 미사용이 흔한 원인입니다.

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",
)

인덱스 기반 조인

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를 명시해 덮어쓰기 방지

관련 가이드


핵심 포인트

  • 의도를 갖고 조인을 선택하라; 보강 목적이면 left가 안전하다.
  • validate, indicator, suffixes로 문제를 조기에 발견하라.
  • 키와 dtype을 맞추고, 차원 테이블을 중복 제거해 폭발을 막아라.