SQL join, Pandas 방언
pd.merge(left, right, on='key', how='inner|left|right|outer') 는 SQL 에서 알던 네 가지 join 에 보너스 하나 (cross) 를 얹어 구현해. 테이블 결합의 일꾼이지 — 그리고 제일 크게 터지는 silent bug 들의 서식지이기도 해. Row 수가 거의 확실히 잘못된 방향으로 바뀌어도 Pandas 는 경고 한 줄 안 하거든.
고전 함정 4가지
- 숨은 1-to-many fan-out. Right 테이블의 key 에 중복이 있으면 inner/left join 이 left row 를 부풀려. 1,000 row 였던 left 가 join 후 8,500 row 가 될 수 있어 — 그리고 매출이 세 배로 뛰고 나서야 알아채기도 해.
- Key 타입 불일치. String
'42'는 정수42와 안 만나. 한쪽customer_id는int64, 다른쪽은string[pyarrow]— 현실에서 제일 자주 보는 꼴이야. - 공백과 대소문자.
'NewYork'과'New York'은 join 안 되고,'NEW YORK'과'New York'도 안 돼. Merge 전에 strip 하고 정규화해. - Many-to-many 는 조용한 Cartesian. 같은 key 가 양쪽에 여러 번 있으면 row 가 곱으로 폭발해. Merge 전에 cardinality 를 검증해.
Pandas 는 정확히 이 cardinality 함정을 위해 merge 에 validate= argument 를 마련해 놨어. 항상 써. validate='one_to_one', 'one_to_many', 'many_to_one' 은 관계가 어긋나는 순간 명시적으로 raise 해 — 그게 바로 원하는 동작이야.