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",
)인덱스 기반 조인
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을 맞추고, 차원 테이블을 중복 제거해 폭발을 막아라.