SQL join, Pandas 방언
pd.merge(left, right, on='key', how='inner|left|right|outer') 는 SQL 에서 아는 네 가지 join 타입 + 보너스 하나 (cross) 구현. 테이블 결합의 일꾼 — 그리고 가장 임팩트 큰 silent bug 가 사는 곳이기도 해, 왜냐면 Pandas 가 거의 확실히 잘못된 방식으로 row 수 바뀌어도 경고 안 해.
고전 함정 4가지
- 묵시적 1-to-many fan-out. Right 테이블의 key 가 중복이면 inner/left join 이 left row 를 부풀려. 1,000 row left 가 join 후 8,500 row 가 될 수 있어 — 그리고 매출이 세 배 되기 전엔 못 알아챌 수 있어.
- Key 의 type mismatch. String
'42'를 정수42와 join 하면 매칭 안 돼. 한쪽엔customer_id가int64, 다른쪽엔string[pyarrow]— 현실 고전. - 공백 + case mismatch.
'NewYork'와'New York'안 join.'NEW YORK'와'New York'안 join. Merge 전에 strip + 정규화. - Many-to-many 가 silent Cartesian 으로. 양쪽에 같은 key 가 여러 번이면 곱으로 row 폭발. Merge 전에 cardinality 검증.
Pandas 는 정확히 cardinality 함정용 validate= argument 를 merge 에 노출. 항상 써. validate='one_to_one', 'one_to_many', 'many_to_one' 는 관계 안 맞으면 명시적 에러 raise — 원하는 거.