개발은 처음이라 개발새발

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

파이썬/판다스

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

leon_choi 2022. 9. 13. 23:36
반응형

https://data-so-hard.tistory.com/50

 

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

안녕하세요. 2주만의 포스팅을 하게 됐습니다. 오늘 포스팅할 것은 concat()함수에 이어 merge()함수로 데이터프레임을 병합하는 것입니다. merge()함수는 SQL의 join과 비슷한 방식으로 어떤 기준에 의

data-so-hard.tistory.com

지난 1편에 이어서 merge 함수의 옵션에 대해 알아보겠습니다. 이번 시간에는 'how=' 옵션에 대해 알아보려고 하는데요. how 옵션을 통해서는 왼쪽과 오른쪽을 기준으로 데이터 값을 병합합니다. 또한 left_on과 right_on 옵션을 사용하면 좌우 데이터프레임의 키값을 다르게 지정할 수 있습니다. 우선 데이터들을 보겠습니다. 

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와 병합을 해보려합니다. 그리고 같은 회사명을 담고 있지만 컬럼명이 다른 stock_name과 name 각각 left_on, right_on으로 지정해서 병합하겠습니다.

#왼쪽 기준으로 병합하기
merge_left= pd.merge(df1, df2, how='left', left_on='stock_name',right_on='name')
print(merge_left)
#merge_left
    id_x       stock_name      value   price      id_y    name           eps       bps        per       pbr
0  128940       한미약품   59385.666667  421000       NaN     NaN           NaN       NaN        NaN       NaN
1  130960     CJ E&M   58540.666667   98900  130960.0  CJ E&M   6301.333333   54068.0  15.695091  1.829178
2  138250      엔에스쇼핑   14558.666667   13200       NaN     NaN           NaN       NaN        NaN       NaN
3  139480        이마트  239230.833333  254500  139480.0     이마트  18268.166667  295780.0  13.931338  0.860437
4  142280     녹십자엠에스     468.833333   10200       NaN     NaN           NaN       NaN        NaN       NaN
5  145990        삼양사   82750.000000   82000  145990.0     삼양사   5741.000000  108090.0  14.283226  0.758627
6  185750        종근당   40293.666667  100500  185750.0     종근당   3990.333333   40684.0  25.185866  2.470259
7  192400      쿠쿠홀딩스  179204.666667  177500       NaN     NaN           NaN       NaN        NaN       NaN
8  199800         툴젠   -2514.333333  115400       NaN     NaN           NaN       NaN        NaN       NaN
9  204210     모두투어리츠    3093.333333    3475  204210.0  모두투어리츠     85.166667    5335.0  40.802348  0.651359

merge()함수를 불린 인덱싱과 함께 사용하면 원하는 데이터를 추출할 수 있는데요. 이번에는 df1에서 price 컬럼이 50000미만인 종목을 찾아 이를 df2와 병합시켜보도록 하겠습니다. 

#불린 인덱싱과 결합하여 원하는 데이터 찾기
price = df1[df1['price'] < 50000]
print(price , '\n')

value = pd.merge(price, df2)
print(value)
  id stock_name         value  price
2  138250      엔에스쇼핑  14558.666667  13200
4  142280     녹십자엠에스    468.833333  10200
9  204210     모두투어리츠   3093.333333   3475 

       id stock_name        value  price    name        eps   bps        per       pbr
0  204210     모두투어리츠  3093.333333   3475  모두투어리츠  85.166667  5335  40.802348  0.651359

네 이렇게 price가 50000미만인 데이터 중 df1과 df2 모두 공통으로 있는데 데이터를 추출해냈습니다. 다음 시간에는 데이터그룹 연산에 대해 알아보도록 하겠습니다.

반응형