본문 바로가기

Language/Python

Python Pandas Merge(Join) 조인 합치기

728x90

krksap.tistory.com/1468

내용이 길어져서 위 글에서 분리 했습니다. 'Python Pandas 사용 방법'

 

www.youtube.com/watch?v=xNkLIimJlKA

이 내용은 데이터베이스 정규화, Join에 대해 알고 써야 해서 위 링크를 첨부합니다.

 

데이터를 다루다 보면 데이터를 합치고 싶을 때가 있습니다. 물론 pandas에서도 합칠 수 있습니다. 이 기능을 join이라고 하는데 pandas에서는 .merge()함수로 join을 구현 할 수 있습니다.

 

Merge(join)


inner join

import pandas as pd
from pandas import DataFrame as df
과자목록1 = ['초코-파이','몽-쉘','빼빼로','호두파이','별-사탕']
과자목록2 = ['초코-파이','몽-쉘','바나나킥','땅콩파이','못난감자','초코칩쿠키','엄마손파이']
가격1 = ['500', '1000', '700', '800', '600']
가격2 = ['550', '1500', '750', '800', '600','500','400']

df1 = df(data={'과자': 과자목록1, '비고' : 0})
df2 = df(data={'과자': 과자목록2,'가격':가격2})

df_merged = pd.merge(df1, df2, on='과자')

print(df_merged)

right join

# 위와 같음
df_merged = pd.merge(df1, df2, how='right', on='과자')

여러개 column으로 merge하기

import pandas as pd

owner = {'p1.age': [56], 'p1.sex':[1], 'p2.age':[53], 'p2.sex':[2]}
pop = {'p1.age': [56], 'p1.sex':[1], 'p2.age':[53], 'p2.sex':[2], 'p3.age':[4], 'p3.sex':[1]}
df_owner = pd.DataFrame(owner)
df_pop = pd.DataFrame(pop)

# 4개의 key로 merge해야 함 add_code, p1.sex, p2.sex, p1.age, p2.age
df_merged = pd.merge(df_owner, df_pop, on=['p1.age', 'p1.sex', 'p2.age', 'p2.sex'])

print(df_merged)

결과

   p1.age  p1.sex  p2.age  p2.sex  p3.age  p3.sex
0      56       1      53       2       4       1

Merge test 1

import pandas as pd
df_owner = pd.DataFrame({'p1.age': [56, 56], 'p1.sex':[1,1], 'p2.age':[53, 54], 'p2.sex':[2, 2]})
df_pop = pd.DataFrame({'p1.age': [56], 'p1.sex':[1], 'p2.age':[53], 'p2.sex':[2], 'p3.age':[4], 'p3.sex':[1]})

df_merged = pd.merge(df_owner, df_pop, on=['p1.age', 'p1.sex', 'p2.age', 'p2.sex'])
print(df_merged)

결과

   p1.age  p1.sex  p2.age  p2.sex  p3.age  p3.sex
0      56       1      53       2       4       1

위와 같이 df_owner에는 2줄의 record가 있고 df_pop에는 1개의 record만 있을 때 실제로 merge될 수 있는 것은 한줄 뿐입니다. 그래서 결과도 위와 같이 한줄로만 나옵니다.

Left Join

위와 같은 경우 df_owner에 record가 2개가 있지만 조인이 될 수 있는 것은 1줄 뿐이라서 한줄만 나왔습니다. 그러면 왼쪽(df_owner)에 있는 모든 record는 나오지만 오른쪽(df_pop)에 없는 값은 column만 보이게 join을 하고 싶다면 어떻게 할까요? Left Join을 쓰면 됩니다.

import pandas as pd
df_owner = pd.DataFrame({'p1.age': [56, 56], 'p1.sex':[1,1], 'p2.age':[53, 54], 'p2.sex':[2, 2]})
df_pop = pd.DataFrame({'p1.age': [56], 'p1.sex':[1], 'p2.age':[53], 'p2.sex':[2], 'p3.age':[4], 'p3.sex':[1]})

df_merged = pd.merge(df_owner, df_pop, how='left', on=['p1.age', 'p1.sex', 'p2.age', 'p2.sex'])
print(df_merged)

결과

   p1.age  p1.sex  p2.age  p2.sex  p3.age  p3.sex
0      56       1      53       2     4.0     1.0
1      56       1      54       2     NaN     NaN

위 code와 같이 how에 left를 써주면 됩니다.

728x90
블로그 주인장입니다. 원하시는 정보는 얻으셨나요? 이 포스트에서 추가로 필요한 정보가 있으시면 여기에 남겨주세요.