'DataFrame을 index 기준으로 합치기'에 해당되는 글 1건

  1. 2016.12.06 [Python pandas] DataFrame을 index 기준으로 합치기 (merge, join on index) 3

지난번 포스팅에서는 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
K0  A0  B0
K1  A1  B1
K2  A2  B2
K3  A3  B3


In [6]: df_right

Out[6]:

     C   D
K2  C2  D2
K3  C3  D3
K4  C4  D4
K5  C5  D5

 

 

 

 

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
K0  A0  B0  NaN  NaN
K1  A1  B1  NaN  NaN
K2  A2  B2   C2   D2
K3  A3  B3   C3   D3

 

# way 2 : by join

In [8]: df_left.join(df_right, how='left')

Out[8]:

     A   B    C    D
K0  A0  B0  NaN  NaN
K1  A1  B1  NaN  NaN
K2  A2  B2   C2   D2
K3  A3  B3   C3   D3

 

 

 

 

  (2) index를 기준으로 Right Join 하기 (Right join on index)

 


# 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
K2   A2   B2  C2  D2
K3   A3   B3  C3  D3
K4  NaN  NaN  C4  D4
K5  NaN  NaN  C5  D5

 

# way 2 : join()

In [10]: df_left.join(df_right, how='right')

Out[10]:

      A    B   C   D
K2   A2   B2  C2  D2
K3   A3   B3  C3  D3
K4  NaN  NaN  C4  D4
K5  NaN  NaN  C5  D5

 

 

 

 

  (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
K2  A2  B2  C2  D2
K3  A3  B3  C3  D3

 


# way 2 : by join()

In [12]: df_left.join(df_right, how='inner')

Out[12]:

     A   B   C   D
K2  A2  B2  C2  D2
K3  A3  B3  C3  D3

 

 

 

 

  (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
K0   A0   B0  NaN  NaN
K1   A1   B1  NaN  NaN
K2   A2   B2   C2   D2
K3   A3   B3   C3   D3
K4  NaN  NaN   C4   D4
K5  NaN  NaN   C5   D5

 


# way 2 : by join()

In [14]: df_left.join(df_right, how='outer')

Out[14]:

      A    B    C    D
K0   A0   B0  NaN  NaN
K1   A1   B1  NaN  NaN
K2   A2   B2   C2   D2
K3   A3   B3   C3   D3
K4  NaN  NaN   C4   D4
K5  NaN  NaN   C5   D5

 

 

 


위의 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
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K2
3  A3  B3  K3


In [18]: df_right_2  # with 'index'

Out[18]:

     C   D
K2  C2  D2
K3  C3  D3
K4  C4  D4
K5  C5  D5

 

 

 

 

이제 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
0  A0  B0  K0  NaN  NaN
1  A1  B1  K1  NaN  NaN
2  A2  B2  K2   C2   D2
3  A3  B3  K3   C3   D3

 

 

# way 2 : join()

In [20]: df_left_2.join(df_right_2, on='KEY', how='left')

Out[20]:

    A   B KEY    C    D
0  A0  B0  K0  NaN  NaN
1  A1  B1  K1  NaN  NaN
2  A2  B2  K2   C2   D2
3  A3  B3  K3   C3   D3

 

 

 

이상으로 DataFrame을 index 기준으로 합치는 방법에 대한 소개를 마치겠습니다.

 

 

728x90
반응형
Posted by Rfriend
,