[Python pandas] DataFrame을 index 기준으로 합치기 (merge, join on index)
Python 분석과 프로그래밍/Python 데이터 전처리 2016. 12. 6. 23:47지난번 포스팅에서는 Python pandas의 merge() 함수를 사용해서 Key를 기준으로 DataFrame을 합치는 방법을 소개하였습니다.
이번 포스팅에서는 pandas의 merge(), join() 함수를 사용해서 index를 기준으로 DataFrame을 합치는 방법을 소개하도록 하겠습니다.
SQL이나 R 사용자라면 index 사용하는게 좀 낯설을 수도 있을 것 같습니다.
먼저 필요한 Library를 importing하고, 간단한 DataFrame 을 예로 만들어 보겠습니다.
In [1]: import pandas as pd In [2]: from pandas import DataFrame In [3]: df_left = DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], ...: 'B': ['B0', 'B1', 'B2', 'B3']}, ...: index=['K0', 'K1', 'K2', 'K3']) In [4]: df_right = DataFrame({'C': ['C2', 'C3', 'C4', 'C5'], ...: 'D': ['D2', 'D3', 'D4', 'D5']}, ...: index=['K2', 'K3', 'K4', 'K5']) ...: In [5]: df_left Out[5]: A B In [6]: df_right Out[6]: C D
|
index를 기준으로 DataFrame을 합치는 방법에는 pd.merge() 와 join() 두 가지 방법이 있는데요, join() 이 code가 간결한 편이며, code에 대한 가독성은 pd.merge()가 좀더 명확한 편입니다.
(1) index를 기준으로 Left Join 하기 (Left join on index) |
# Left joining on index # way 1 : by merge() In [7]: pd.merge(df_left, df_right,...: left_index=True, right_index=True, ...: how='left') Out[7]: A B C D
# way 2 : by join In [8]: df_left.join(df_right, how='left') Out[8]: A B C D
|
(2) index를 기준으로 Right Join 하기 (Right join on index) |
# way 1 : merge() In [9]: pd.merge(df_left, df_right, ...: left_index=True, right_index=True, ...: how='right') Out[9]: A B C D
# way 2 : join() In [10]: df_left.join(df_right, how='right') Out[10]: A B C D
|
(3) index를 기준으로 inner join 하기 (inner join on index) |
# inner join on index # way 1 : by merge() In [11]: pd.merge(df_left, df_right, ...: left_index=True, right_index=True, ...: how='inner') Out[11]: A B C D
In [12]: df_left.join(df_right, how='inner') Out[12]: A B C D
|
(4) index를 기준으로 outer join 하기 (outer join on index) |
# outer join on index # way 1 : by pd.merge() In [13]: pd.merge(df_left, df_right, ...: left_index=True, right_index=True, ...: how='outer') Out[13]: A B C D
In [14]: df_left.join(df_right, how='outer') Out[14]: A B C D
|
위의 4개의 index 기준 DataFrame 병합 사례에서는 양쪽 DataFrame 모두 index를 사용했습니다.
그런데 만약 한쪽 DataFrame은 index를 기준으로 하고, 나머지 한쪽 DataFrame에서는 Key 변수를 기준으로 해서 두 DataFrame을 합쳐야 한다면 어떻게 해야 할까요?
pd.merge()와 join() 두 가지 방법을 how='left' 의 경우만 예를 들어서 설명하겠습니다. 역시 join() 이 script가 간결한 반면, pd.merge()가 병합의 기준을 명시해줌으로써 가독성은 더 좋습니다. 뭘 사용할지는 개인의 취향에 따라 선택하시면 됩니다.
(5) index와 Key를 혼합해서 DataFrame 합치기 (Joining key columns on an index) |
먼저 df_left_2 는 'KEY' 를 가진 DataFrame으로 만들고, df_right_2는 index를 가진 DataFrame으로 만든 후에 이 둘을 'KEY'와 index를 혼합해서 사용해서 합쳐보겠습니다.
# making DataFrame In [15]: df_left_2 = DataFrame({'KEY': ['K0', 'K1', 'K2', 'K3'], ...: 'A': ['A0', 'A1', 'A2', 'A3'], ...: 'B': ['B0', 'B1', 'B2', 'B3']}) ...: In [16]: df_right_2 = DataFrame({'C': ['C2', 'C3', 'C4', 'C5'], ...: 'D': ['D2', 'D3', 'D4', 'D5']}, ...: index=['K2', 'K3', 'K4', 'K5']) ...: In [17]: df_left_2 # with 'KEY' Out[17]: A B KEY In [18]: df_right_2 # with 'index' Out[18]: C D
|
이제 Key와 index를 혼합해서 두 DataFrame을 합쳐보겠습니다.
# joining key columns on an index # way 1 : pd.merge() In [19]: pd.merge(df_left_2, df_right_2, ...: left_on='KEY', right_index=True, ...: how='left') ...: Out[19]: A B KEY C D
# way 2 : join() In [20]: df_left_2.join(df_right_2, on='KEY', how='left') Out[20]: A B KEY C D
|
이상으로 DataFrame을 index 기준으로 합치는 방법에 대한 소개를 마치겠습니다.