파이썬/판다스

merge()함수로 데이터프레임 병합하기 [python/pandas]

leon_choi 2022. 9. 3. 13:53
반응형

안녕하세요. 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 함수의 기본에 대해 소개해드렸는데요. 다음 시간에는 이를 토대로 좀 더 여러 방식에 대해 알아보겠습니다. 

반응형