본문으로 건너뛰기
김신건의 로그

[Pandas] merge

· 수정 · 📖 약 1분 · 306자/단어 #python #pandas #merge #join
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
idnameuser_idamount
01Alice1100
11Alice1200
22Bob2150

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 끼리 매칭이 기본 가정이라 코드가 짧다. 컬럼 기준…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기