개요
두 개 이상의 DataFrame을 합치는 병합 및 연결 방법을 정리한다.
DataFrame 병합(merge)
두 개의 DataFrame이 공통으로 가진 열이나 인덱스를 기준으로 테이블을 합친다. 기준이 되는 열, 또는 행 데이터를 Key라고 한다.
예로 들어 아래와 같은 두 개의 DataFrame이 있다고 하자.
df1 = pd.DataFrame({
'고객번호': [1001, 1002, 1003, 1004, 1005, 1006, 1007],
'이름': ['둘리', '도우너', '또치', '길동', '희동', '마이콜', '영희']
}, columns=['고객번호', '이름'])
df2 = pd.DataFrame({
'고객번호': [1001, 1001, 1005, 1006, 1008, 1001],
'금액': [10000, 20000, 15000, 5000, 100000, 30000]
}, columns=['고객번호', '금액'])
df1
df2
# 실행 결과
고객번호 이름
0 1001 둘리
1 1002 도우너
2 1003 또치
3 1004 길동
4 1005 희동
5 1006 마이콜
6 1007 영희
고객번호 금액
0 1001 10000
1 1001 20000
2 1005 15000
3 1006 5000
4 1008 100000
5 1001 30000
위 DataFrame을 merge 함수로 합치면, 두 DataFrame이 공통으로 가진 고객번호 Column을 기준으로 데이터를 합친다. 합칠 때는 기본적으로 inner join 방식을 사용한다.
pd.merge(df1, df2)
# 실행 결과
고객번호 이름 금액
0 1001 둘리 10000
1 1001 둘리 20000
2 1001 둘리 30000
3 1005 희동 15000
4 1006 마이콜 5000
outer join 방식을 사용할 때는 아래와 같이 how 매개변수를 사용한다. outer라고 지정하는 경우에는 full outer join을, left 또는 right로 지정하는 경우에는 각각 left outer join, right outer join을 수행한다.
pd.merge(df1, df2, how='outer')
pd.merge(df1, df2, how='left')
pd.merge(df1, df2, how='right')
# 실행 결과
고객번호 이름 금액
0 1001 둘리 10000.0
1 1001 둘리 20000.0
2 1001 둘리 30000.0
3 1002 도우너 NaN
4 1003 또치 NaN
5 1004 길동 NaN
6 1005 희동 15000.0
7 1006 마이콜 5000.0
8 1007 영희 NaN
9 1008 NaN 100000.0
고객번호 이름 금액
0 1001 둘리 10000.0
1 1001 둘리 20000.0
2 1001 둘리 30000.0
3 1002 도우너 NaN
4 1003 또치 NaN
5 1004 길동 NaN
6 1005 희동 15000.0
7 1006 마이콜 5000.0
8 1007 영희 NaN
고객번호 이름 금액
0 1001 둘리 10000
1 1001 둘리 20000
2 1005 희동 15000
3 1006 마이콜 5000
4 1008 NaN 100000
5 1001 둘리 30000
키 값이 같은 데이터가 여럿인 경우 가능한 모든 조합을 만들어낸다.
또한 merge 시 이름이 같은 열은 모두 키가 되기 때문에, 키가 되면 안 되는 열이 있는 경우에는 on 매개변수로 병합 기준 열을 명시해야 한다.
df1 = pd.DataFrame({
'고객명': ['춘향', '춘향', '몽룡'],
'날짜': ['2018-01-01', '2018-01-02', '2018-01-01'],
'데이터': ['20000', '30000', '100000']})
df2 = pd.DataFrame({
'고객명': ['춘향', '몽룡'],
'데이터': ['여자', '남자']})
df1
df2
pd.merge(df1, df2, on='고객명')
고객명 날짜 데이터
0 춘향 2018-01-01 20000
1 춘향 2018-01-02 30000
2 몽룡 2018-01-01 100000
고객명 데이터
0 춘향 여자
1 몽룡 남자
고객명 날짜 데이터_x 데이터_y
0 춘향 2018-01-01 20000 여자
1 춘향 2018-01-02 30000 여자
2 몽룡 2018-01-01 100000 남자
기준 열이 아니면서 이름이 같은 열은 _x, _y와 같은 접미사가 붙는다.
키가 되어야 하는 기준 열의 이름이 다르다면 left_on, right_on 매개변수로 기준 열을 명시해야 한다.
df1 = pd.DataFrame({
'이름': ['영희', '철수', '철수'],
'성적': [1, 2, 3]})
df2 = pd.DataFrame({
'성명': ['영희', '영희', '철수'],
'성적2': [4, 5, 6]})
df1
df2
pd.merge(df1, df2, left_on='이름', right_on='성명')
# 실행 결과
이름 성적
0 영희 1
1 철수 2
2 철수 3
성명 성적2
0 영희 4
1 영희 5
2 철수 6
이름 성적 성명 성적2
0 영희 1 영희 4
1 영희 1 영희 5
2 철수 2 철수 6
3 철수 3 철수 6
일반 데이터 열이 아니라 index를 기준으로 병합해야 할 때는 left_index, right_index 매개변수를 True로 지정해야 한다.
df1 = pd.DataFrame({
'도시': ['서울', '서울', '서울', '부산', '부산'],
'연도': [2000, 2005, 2010, 2000, 2005],
'인구': [9853972, 9762546, 9631482, 3655437, 3512547]})
df2 = pd.DataFrame(
np.arange(12).reshape((6, 2)),
index=[['부산', '부산', '서울', '서울', '서울', '서울'],
[2000, 2005, 2000, 2005, 2010, 2015]],
columns=['데이터1', '데이터2'])
df1
df2
pd.merge(df1, df2, left_on=['도시', '연도'], right_index=True)
# 실행 결과
도시 연도 인구
0 서울 2000 9853972
1 서울 2005 9762546
2 서울 2010 9631482
3 부산 2000 3655437
4 부산 2005 3512547
데이터1 데이터2
부산 2000 0 1
2005 2 3
서울 2000 4 5
2005 6 7
2010 8 9
2015 10 11
도시 연도 인구 데이터1 데이터2
0 서울 2000 9853972 4 5
1 서울 2005 9762546 6 7
2 서울 2010 9631482 8 9
3 부산 2000 3655437 0 1
4 부산 2005 3512547 2 3
JOIN 함수
merge 함수 대신 join 함수를 사용해도 된다.
df1 = pd.DataFrame(
[[1., 2.], [3., 4.], [5., 6.]],
index=['a', 'c', 'e'],
columns=['서울', '부산'])
df2 = pd.DataFrame(
[[7., 8.], [9., 10.], [11., 12.], [13, 14]],
index=['b', 'c', 'd', 'e'],
columns=['대구', '광주'])
df1
df2
df1.join(df2, how='outer')
# 실행 결과
서울 부산
a 1.0 2.0
c 3.0 4.0
e 5.0 6.0
대구 광주
b 7.0 8.0
c 9.0 10.0
d 11.0 12.0
e 13.0 14.0
서울 부산 대구 광주
a 1.0 2.0 NaN NaN
b NaN NaN 7.0 8.0
c 3.0 4.0 9.0 10.0
d NaN NaN 11.0 12.0
e 5.0 6.0 13.0 14.0
참고 문서