[Pandas] merge
Pandas merge, DataFrame.merge, pandas join, SQL join in pandas
정의
pandas.merge(left, right, ...) 는 두 DataFrame 을 SQL join 처럼 결합. 4 가지 join 타입 (inner / left / right / outer) 지원.
시각화
4 가지 join 타입
| how | 설명 | SQL |
|---|---|---|
inner (기본) | 양쪽 모두 있는 키만 | INNER JOIN |
left | 왼쪽 모두 + 오른쪽 매칭 | LEFT JOIN |
right | 오른쪽 모두 + 왼쪽 매칭 | RIGHT JOIN |
outer | 양쪽 합집합, NaN 채움 | FULL OUTER JOIN |
cross | 모든 조합 | CROSS JOIN |
기본
python
import pandas as pd
users = pd.DataFrame({'id': [1, 2, 3], 'name': ['Alice', 'Bob', 'Charlie']})
orders = pd.DataFrame({'user_id': [1, 1, 2, 4], 'amount': [100, 200, 150, 50]})
inner = pd.merge(users, orders, left_on='id', right_on='user_id', how='inner')
print(inner) 결과
id name user_id amount
0 1 Alice 1 100
1 1 Alice 1 200
2 2 Bob 2 150| id | name | user_id | amount | |
|---|---|---|---|---|
| 0 | 1 | Alice | 1 | 100 |
| 1 | 1 | Alice | 1 | 200 |
| 2 | 2 | Bob | 2 | 150 |
users 3 명 중 Alice (id=1, 주문 2개), Bob (id=2, 주문 1개) 만 매칭. Charlie 와 orders 의 user_id=4 는 제외.
left join
pd.merge(users, orders, left_on='id', right_on='user_id', how='left')
# Charlie 도 포함, amount 는 NaN
outer join + indicator
pd.merge(a, b, on='key', how='outer', indicator=True)
# _merge 컬럼이 추가됨: left_only, right_only, both
매칭 여부를 시각화하기에 유용.
on / left_on, right_on / left_index, right_index
pd.merge(a, b, on='id') # 양쪽 컬럼 이름 같을 때
pd.merge(a, b, left_on='id', right_on='uid') # 다른 이름
pd.merge(a, b, left_index=True, right_index=True) # index 기반
pd.merge(a, b, left_on='id', right_index=True)
다중 키
pd.merge(a, b, on=['region', 'date'])
pd.merge(a, b, left_on=['region', 'date'], right_on=['reg', 'dt'])
suffixes
같은 이름의 컬럼이 양쪽에 있으면 suffix 가 붙는다.
pd.merge(a, b, on='id')
# 양쪽에 'name' 있으면 → name_x, name_y
pd.merge(a, b, on='id', suffixes=('_a', '_b'))
# → name_a, name_b
validate (1:1, 1:m, m:1, m:m 검증)
pd.merge(a, b, on='id', validate='one_to_one')
pd.merge(a, b, on='id', validate='many_to_one')
# 가정이 깨지면 MergeError
데이터 가정을 명시적으로 검증, 디버깅에 매우 유용.
함정
1. 다대다 폭증
# users: id 가 1, 1 (중복)
# orders: user_id 가 1, 1, 1 (중복)
pd.merge(users, orders, ...)
# 2 × 3 = 6 행 생성, 의도 아닐 가능성
validate='one_to_many' 같은 검증을 추가.
2. dtype 불일치
users['id'] # int64
orders['user_id'] # object (문자)
pd.merge(...) # 매칭 안 됨!
orders['user_id'] = orders['user_id'].astype('int64')
3. NaN 끼리 매칭 안 됨
# 양쪽에 NaN key 가 있어도 매칭 안 됨
# NaN != NaN
merge vs join vs concat
| 동작 | 함수 |
|---|---|
| key 기반 결합 | merge |
| index 기반 결합 (간편 버전) | DataFrame.join |
| 단순 위/옆 붙이기 | concat |
참고
이 글의 용어 (3개)
- [Pandas] concatpandas
- 정의 는 여러 DataFrame/Series 를 세로 (axis=0) 또는 가로 (axis=1) 로 단순 연결. SQL 의 (axis=0) 또는 column-level conca…
- [Pandas] DataFramepandas
- 정의 은 2차원 레이블 테이블. 각 열이 , 모든 열이 같은 (행 라벨) 를 공유. SQL 테이블 / Excel 시트 / R data.frame 의 Python 대응체. 생성 <…
- [Pandas] joinpandas
- 정의 는 index 기반 결합 의 편의 API. 내부적으로는 와 동등하지만 더 짧다. 기본 merge 와의 비교 은 index 끼리 매칭이 기본 가정이라 코드가 짧다. 컬럼 기준…
💬 댓글