merge()함수로 데이터프레임 병합하기 [python/pandas]
안녕하세요. 2주만의 포스팅을 하게 됐습니다. 오늘 포스팅할 것은 concat()함수에 이어 merge()함수로 데이터프레임을 병합하는 것입니다. merge()함수는 SQL의 join과 비슷한 방식으로 어떤 기준에 의해 두 데이터프레임을 병합하는 방법입니다. 이때 기준이 되는 열이나 인덱스를 key라고 부릅니다. 이때 키가 되는 열이나 인덱스는 반드시 합치려는 두 데이터프레임에 모두 존재해야 합니다. 그렇다면 예제를 통해 코딩을 진행해보겠습니다.
import pandas as pd
df1= pd.read_excel('./stock price.xlsx')
df2= pd.read_excel('./stock valuation.xlsx')
print(df1)
print('\n')
print(df2)
print('\n')
###df1
id stock_name value price
0 128940 한미약품 59385.666667 421000
1 130960 CJ E&M 58540.666667 98900
2 138250 엔에스쇼핑 14558.666667 13200
3 139480 이마트 239230.833333 254500
4 142280 녹십자엠에스 468.833333 10200
5 145990 삼양사 82750.000000 82000
6 185750 종근당 40293.666667 100500
7 192400 쿠쿠홀딩스 179204.666667 177500
8 199800 툴젠 -2514.333333 115400
9 204210 모두투어리츠 3093.333333 3475
###df2
id name eps bps per pbr
0 130960 CJ E&M 6301.333333 54068 15.695091 1.829178
1 136480 하림 274.166667 3551 11.489362 0.887074
2 138040 메리츠금융지주 2122.333333 14894 6.313806 0.899691
3 139480 이마트 18268.166667 295780 13.931338 0.860437
4 145990 삼양사 5741.000000 108090 14.283226 0.758627
5 161390 한국타이어 5648.500000 51341 7.453306 0.820007
6 181710 NHN엔터테인먼트 2110.166667 78434 30.755864 0.827447
7 185750 종근당 3990.333333 40684 25.185866 2.470259
8 204210 모두투어리츠 85.166667 5335 40.802348 0.651359
9 207940 삼성바이오로직스 4644.166667 60099 89.790059 6.938551
우선 df1, df2의 데이터를 보면 id는 공통으로 있고 컬럼 이름은 stock_name, name으로 다르지만 같은 값을 가지고 있는 것을 확인할 수 있습니다. 자 이제 이 두 프레임을 합쳐볼까 하는데요. merge()함수는 on=, how= 옵션을 가지고 있는데 on=None, how=inner를 기본값으로 적용합니다. on=None 옵션은 두 데이터프레임에 공통으로 속하는 모든 열을 기준으로 병합한다는 뜻이고 how=inner 옵션은 기준이 되는 열의 데이터가 두 데이터프레임에 공통으로 존재하는 교집합일 경우에만 추출한다는 뜻입니다. 합집합을 원한다면 how=outer로 옵션을 지정해주면 됩니다. 그렇다면 기본과 how=outer 옵션을 적용했을 때를 예제로 살펴보겠습니다.
#merge()함수 기본
merge_inner = pd.merge(df1,df2)
print(merge_inner)
print('\n')
#merge()함수 합집합
merge_outer = pd.merge(df1, df2, how= 'outer', on='id')
print(merge_outer)
###inner
id stock_name value price name eps bps per pbr
0 130960 CJ E&M 58540.666667 98900 CJ E&M 6301.333333 54068 15.695091 1.829178
1 139480 이마트 239230.833333 254500 이마트 18268.166667 295780 13.931338 0.860437
2 145990 삼양사 82750.000000 82000 삼양사 5741.000000 108090 14.283226 0.758627
3 185750 종근당 40293.666667 100500 종근당 3990.333333 40684 25.185866 2.470259
4 204210 모두투어리츠 3093.333333 3475 모두투어리츠 85.166667 5335 40.802348 0.651359
###outer
id stock_name value price name eps bps per pbr
0 128940 한미약품 59385.666667 421000.0 NaN NaN NaN NaN NaN
1 130960 CJ E&M 58540.666667 98900.0 CJ E&M 6301.333333 54068.0 15.695091 1.829178
2 138250 엔에스쇼핑 14558.666667 13200.0 NaN NaN NaN NaN NaN
3 139480 이마트 239230.833333 254500.0 이마트 18268.166667 295780.0 13.931338 0.860437
4 142280 녹십자엠에스 468.833333 10200.0 NaN NaN NaN NaN NaN
5 145990 삼양사 82750.000000 82000.0 삼양사 5741.000000 108090.0 14.283226 0.758627
6 185750 종근당 40293.666667 100500.0 종근당 3990.333333 40684.0 25.185866 2.470259
7 192400 쿠쿠홀딩스 179204.666667 177500.0 NaN NaN NaN NaN NaN
8 199800 툴젠 -2514.333333 115400.0 NaN NaN NaN NaN NaN
9 204210 모두투어리츠 3093.333333 3475.0 모두투어리츠 85.166667 5335.0 40.802348 0.651359
10 136480 NaN NaN NaN 하림 274.166667 3551.0 11.489362 0.887074
11 138040 NaN NaN NaN 메리츠금융지주 2122.333333 14894.0 6.313806 0.899691
12 161390 NaN NaN NaN 한국타이어 5648.500000 51341.0 7.453306 0.820007
13 181710 NaN NaN NaN NHN엔터테인먼트 2110.166667 78434.0 30.755864 0.827447
14 207940 NaN NaN NaN 삼성바이오로직스 4644.166667 60099.0 89.790059 6.938551
네 이렇게 교집합과 합집합 모두 결과를 도출했는데요. outer를 적용했을 때는 on= 옵션에 기준 키가 되는 'id' 컬럼까지 넣어봤습니다. inner일 때는 공통으로 들어가 있는 것들만 추출됐지만 outer는 id를 기준 키로 두 프레임을 모두 합쳤고 없는 데이터의 경우 NaN으로 표출됐습니다. 이렇게 merge 함수의 기본에 대해 소개해드렸는데요. 다음 시간에는 이를 토대로 좀 더 여러 방식에 대해 알아보겠습니다.