DataFrame에 날짜나 이름 등 공통의 컬럼명을 가진 여러 개의 DataFrame을 공통 컬럼명의 값을 가지고 합치는 방법을 알아보겠습니다.
여러개 DataFrame에서 공통의 컬럼명으로 합치기 위해서는 pandas.merge() 함수 또는 pandas.DataFrame의 merge() 메서드를 사용합니다.
merge()를 사용해 지정한 열의 컬럼명을 기준으로 결합하는 방법을 보겠습니다.
- 키 열을 지정: on, left_on, right_on
- 결합 방법을 지정: how
- inner_join: how=’inner’
- left_join: how=’left’
- right_join: how=’right’
- outer_join: how=’outer’
- 데이터 정보를 취득: indicator
- 열 이름이 중복하는 경우의 접미사를 지정: suffixes
- 여러 개 열을 키로 하는 경우
- 키 열로 정렬: sort
DataFrame 인덱스를 사용해 결합하는 방법은 아래를 참조해주세요
pd.merge(), pd.DataFrame.merge()
merge() 함수에는 첫 번째 파라미터로 left, 두 번째 파라미터로 right를 지정해 합치고 싶은 2개의 DataFrame를 설정합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
# 변수 df_ab DataFrame 샘플데이터
# a b
# 0 a_1 b_1
# 1 a_2 b_2
# 2 a_3 b_3
# 변수 df_ac DataFrame 샘플데이터
# a c
# 0 a_1 c_1
# 1 a_2 c_2
# 2 a_4 c_4
print(pd.merge(df_ab, df_ac))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
df_ab의 DataFrame과 df_ac의 DataFrame 결합돼 a, b, c 컬럼명의 값을 출력하고 있습니다.
이번에는 pandas.DataFrame의 merge() 메서드로 결합을 해보겠습니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
# 변수 df_ab의 DataFrame 샘플데이터
# a b
# 0 a_1 b_1
# 1 a_2 b_2
# 2 a_3 b_3
# 변수 df_ac의 DataFrame 샘플데이터
# a c
# 0 a_1 c_1
# 1 a_2 c_2
# 2 a_4 c_4
print(df_ab.merge(df_ac))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
merge() 메서드의 경우는 DataFrame(left)에서 합치고 싶은 DataFrame(right)을 파라미터로 지정합니다.
merge() 함수와 DataFrame의 merge() 메서드의 결과값은 DataFrame 형태로 반환합니다.
on, left_on, right_on
2개의 DataFrame을 결합하는 경우, 기본 설정으로 컬럼명 이름이 같은 열을 키로 사용해 결합을 합니다.
기본값이 아닌 결합 기준이 되는 키를 지정하고 싶은 경우에는 on을 사용합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, on='a'))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
2개의 DataFrame에서 키로 지정할 컬럼명이 다른 경우에는 파라미터 left_on과 right_on을 사용합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a_': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, left_on='a', right_on='a_'))
결과
a b a_ c
0 a_1 b_1 a_1 c_1
1 a_2 b_2 a_2 c_2
df_ab의 a컬럼명과 df_ac의 a_ 컬럼명을 결합 조건으로 사용했습니다.
반환 값에서 컬럼명을 제거하고 싶은 경우에는 drop()를 사용합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a_': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac_, left_on='a', right_on='a_').drop(columns='a_'))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
how
결합 방법은 파라미터 how를 사용합니다.
how에는 문자열을 지정합니다.
기본값은 how=’inner’ 입니다.
데이터가 없는 요소는 결측값 NaN이 됩니다.
내부 결합 (inner_join): how=’inner’
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, on='a', how='inner'))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
왼쪽 결합 (left_join): how=’left’
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, on='a', how='left'))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
2 a_3 b_3 NaN
오른쪽 결합 (right_join): how=’right’
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, on='a', how='right'))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
2 a_4 NaN c_4
외부 결합 (outer_join): how=’outer’
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, on='a', how='outer'))
결과
a b c
0 a_1 b_1 c_1
1 a_2 b_2 c_2
2 a_3 b_3 NaN
3 a_4 NaN c_4
indicator
파라미터 indicator를 True로 설정하면, 원래 데이터의 데이터 정보를 포함한 열이 추가됩니다.
추가되는 열의 컬럼명 이름의 기본값은 _merge로 추가됩니다.
값은 both, left_only, right_only 중 하나가 표시됩니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, on='a', how='inner', indicator=True))
print('---------------------------')
print(pd.merge(df_ab, df_ac, on='a', how='outer', indicator=True))
결과
a b c _merge
0 a_1 b_1 c_1 both
1 a_2 b_2 c_2 both
---------------------------
a b c _merge
0 a_1 b_1 c_1 both
1 a_2 b_2 c_2 both
2 a_3 b_3 NaN left_only
3 a_4 NaN c_4 right_only
기본값 _merge 아닌 컬럼명을 설정하고 싶은 경우에는 파라미터 indicator에 문자열을 지정합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'c': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_ac, on='a', how='outer', indicator='indicator'))
결과
a b c indicator
0 a_1 b_1 c_1 both
1 a_2 b_2 c_2 both
2 a_3 b_3 NaN left_only
3 a_4 NaN c_4 right_only
suffixes
2개의 DataFrame에서 결합 조건으로 사용할 키 외에 컬럼명 이름이 중복하는 경우 기본값으로 _x, _y 접미사(suffixes)가 붙습니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_b = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_b, on='a'))
결과
a b_x b_y
0 a_1 b_1 c_1
1 a_2 b_2 c_2
접미사를 원하는 이름으로 지정하고 싶은 경우에는 파라미터 suffixes에 left에서 사용할 접미사와 right에서 사용할 접미사를 리스트나 튜플 형태로 지정합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']})
df_b = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']})
print(pd.merge(df_ab, df_b, on='a', suffixes=['_left', '_right']))
결과
a b_left b_right
0 a_1 b_1 c_1
1 a_2 b_2 c_2
여러개 키를 지정
여러개의 열을 키로 지정하는 방법을 알아보겠습니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']
, 'x':['x_2', 'x_2', 'x_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']
, 'x':['x_1', 'x_2', 'x_2']})
# 변수 df_ab의 DataFrame 샘플데이터
# a b x
# 0 a_1 b_1 x_2
# 1 a_2 b_2 x_2
# 2 a_3 b_3 x_3
# 변수 df_ac의 DataFrame 샘플데이터
# a b x
# 0 a_1 c_1 x_1
# 1 a_2 c_2 x_2
# 2 a_4 c_4 x_2
기본적으로 컬럼명이 같은 열이 여러 개 있는 경우에는 결합 키로써 사용이 됩니다.
컬럼명을 명시적으로 지정하고 싶은 경우에는 on에 리스트 형태로 지정을 합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']
, 'x':['x_2', 'x_2', 'x_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']
, 'x':['x_1', 'x_2', 'x_2']})
print(pd.merge(df_ab, df_ac))
print('---------------------------')
print(pd.merge(df_ab, df_ac, on=['a', 'x']))
결과
a b x c
0 a_2 b_2 x_2 c_2
--------------------------
a b x c
0 a_2 b_2 x_2 c_2
컬럼명이 같은 열이 여러개 존재하는 DataFrame에서 결합 키를 하나만 지정하고 싶은 경우에는 on에 컬럼명을 설정합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']
, 'x':['x_2', 'x_2', 'x_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']
, 'x':['x_1', 'x_2', 'x_2']})
print(pd.merge(df_ab, df_ac, on='a'))
결과
a b x_x c x_y
0 a_1 b_1 x_2 c_1 x_1
1 a_2 b_2 x_2 c_2 x_2
DataFrame 컬럼명이 다른 열을 키로 사용하고 싶은 경우에는 left_on, right_on에 리스트 형태로 컬럼명을 설정합니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']
, 'x':['x_2', 'x_2', 'x_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']
, 'x_':['x_1', 'x_2', 'x_2']})
print(pd.merge(df_ab, df_ac, left_on=['a', 'x'], right_on=['a', 'x_']))
결과
a b x c x_
0 a_2 b_2 x_2 c_2 x_2
파라미터 how를 사용하면 키를 하나로 사용한 것과 동일한 결과가 나옵니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']
, 'x':['x_2', 'x_2', 'x_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']
, 'x':['x_1', 'x_2', 'x_2']})
print(pd.merge(df_abx, df_acx, on=['a', 'x'], how='inner'))
# a b x c
# 0 a_2 b_2 x_2 c_2
print(pd.merge(df_abx, df_acx, on=['a', 'x'], how='left'))
# a b x c
# 0 a_1 b_1 x_2 NaN
# 1 a_2 b_2 x_2 c_2
# 2 a_3 b_3 x_3 NaN
print(pd.merge(df_abx, df_acx, on=['a', 'x'], how='right'))
# a b x c
# 0 a_2 b_2 x_2 c_2
# 1 a_1 NaN x_1 c_1
# 2 a_4 NaN x_2 c_4
print(pd.merge(df_abx, df_acx, on=['a', 'x'], how='outer'))
# a b x c
# 0 a_1 b_1 x_2 NaN
# 1 a_2 b_2 x_2 c_2
# 2 a_3 b_3 x_3 NaN
# 3 a_1 NaN x_1 c_1
# 4 a_4 NaN x_2 c_4
sort
키를 사용해 정렬하고 싶은 경우에는 sort를 사용합니다.
파라미터 sort에 True를 지정해보겠습니다.
import pandas as pd
df_ab = pd.DataFrame({'a': ['a_1', 'a_2', 'a_3']
, 'b': ['b_1', 'b_2', 'b_3']
, 'x':['x_2', 'x_2', 'x_3']})
df_ac = pd.DataFrame({'a': ['a_1', 'a_2', 'a_4']
, 'b': ['c_1', 'c_2', 'c_4']
, 'x':['x_1', 'x_2', 'x_2']})
print(pd.merge(df_abx, df_acx, on=['a', 'x'], how='outer', sort=True))
결과
a b x c
0 a_1 NaN x_1 c_1
1 a_1 b_1 x_2 NaN
2 a_2 b_2 x_2 c_2
3 a_3 b_3 x_3 NaN
4 a_4 NaN x_2 c_4
결합 키 열을 기준으로 결과가 정렬됐습니다.
정리
여러개의 DataFrame을 결합하는 방법인 pd.merge 함수와 DataFrame의 merge 메서드 사용방법을 알아봤습니다.
기본적으로 pd.merge 함수와 DataFrame의 merge 메서드 사용방법은 같습니다.
원하는 결합 결과 값을 반환하기 위해서는 파라미터를 조합해서 사용하면 가능할 거 같습니다.
하지만 생각보다 조금 복작해질 수도 있으니 주의해서 사용해야겠습니다.
댓글