ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] DataFrame pd.merge 알아보기 (Join)
    Python 2024. 4. 9. 06:40
    728x90
    반응형

     

    - 목차

     

    키워드.

    • Join
    • DataFrame
    • how
    • on
    • left_index & right_index

     

    들어가며.

    이번 글에서는 두 DataFrame 을 Join 하는 merge Function 에 대해서 알아보려고 합니다.

     

    기본적인 사용법.

    pd.merge 의 기본적인 사용법은 아래와 같습니다.

    SQL 의 Join 쿼리의 사용법과 유사합니다.

    두개의 DataFrame 이 있고 서로 공유하는 하나의 Column 이 있다면 공통의 Column 을 기준으로 pd.merge 가 동작합니다.

    import pandas as pd
    
    left_data = [["Andy", 32],["Bob", 12],["Chris", 44],["Daniel", 25]]
    right_data = [["Andy", "Seoul"],["Bob", "LA"],["Chris", "Seoul"],["Daniel", "Tokyo"]]
    
    left_df = pd.DataFrame(left_data, columns=["name", "age"])
    right_df = pd.DataFrame(right_data, columns=["name", "city"])
    
    merged_df = pd.merge(left_df, right_df, on="name", how="inner")

     

    left_df is 
         name  age
    0    Andy   32
    1     Bob   12
    2   Chris   44
    3  Daniel   25
    
    right_df is 
         name   city
    0    Andy  Seoul
    1     Bob     LA
    2   Chris  Seoul
    3  Daniel  Tokyo
    
    merged_df is 
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo

     

    "left_df""right_df" 가 pd.merge 를 통해서 "merged_df" 가 됩니다.

    그리고 left_df 가 가지지 않은 city 칼럼과 right_df 가 가지지 않은 age 칼럼은 merged_df 에 모두 존재합니다.

     

    left join.

    pd.merge 함수의 argument 중에서 how 라는 인자가 존재합니다.

    how 는 inner, left, right 와 같이 Join Operation 의 종류를 결정합니다.

    left join 을 수행하기 위해서는 how 의 값은 "left" 가 됩니다.

     

    아래 예시는 위의 예시에서 데이터를 변형하였습니다.

    import pandas as pd
    
    left_data = [["Andy", 32],["Bob", 12],["Chris", 44],["Fabian", 25]]
    right_data = [["Andy", "Seoul"],["Bob", "LA"],["Chris", "Seoul"],["Daniel", "Tokyo"]]
    
    left_df = pd.DataFrame(left_data, columns=["name", "age"])
    right_df = pd.DataFrame(right_data, columns=["name", "city"])
    
    merged_df = pd.merge(left_df, right_df, on="name", how="inner")
    left_df is 
         name  age
    0    Andy   32
    1     Bob   12
    2   Chris   44
    3  Fabian   25
    
    right_df is 
         name   city
    0    Andy  Seoul
    1     Bob     LA
    2   Chris  Seoul
    3  Daniel  Tokyo
    
    merged_df is 
        name  age   city
    0   Andy   32  Seoul
    1    Bob   12     LA
    2  Chris   44  Seoul

     

    left_df 와 right_df 의 Inner Join 연산을 수행합니다.

    left_df 과 right_df 의 name 칼럼은 Fabian, Daniel 이라는 서로 다른 값을 공유합니다.

    그래서 이 두 값에 대한 Inner Join 연산을 수행되지 않아서 merge_df 는 Andy, Bob, Chris 인 3개의 Row 만을 가집니다.

     

    이 과정에서 left join 을 수행하게 되면,

    left_df 의 name 칼럼값을 기준으로 Join Operation 이 수행되구요.

    left_df 만이 가지는 Fabian 이라는 값은 right_df 와 공통으로 소유하지 않은 값이므로

    merged_df 에서 Fabian 에 해당하는 Row 는 city 값을 가지지 못합니다.

    그래서 NaN 값이 할당되게 되죠.

    import pandas as pd
    
    left_data = [["Andy", 32],["Bob", 12],["Chris", 44],["Fabian", 25]]
    right_data = [["Andy", "Seoul"],["Bob", "LA"],["Chris", "Seoul"],["Daniel", "Tokyo"]]
    
    left_df = pd.DataFrame(left_data, columns=["name", "age"])
    right_df = pd.DataFrame(right_data, columns=["name", "city"])
    
    merged_df = pd.merge(left_df, right_df, on="name", how="left")
    left_df is 
         name  age
    0    Andy   32
    1     Bob   12
    2   Chris   44
    3  Fabian   25
    
    right_df is 
         name   city
    0    Andy  Seoul
    1     Bob     LA
    2   Chris  Seoul
    3  Daniel  Tokyo
    
    merged_df is 
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Fabian   25    NaN

     

    left_index & right_index 이란 ?

    pd.merge 함수의 "on" argument 를 사용하여 두 DataFrame 이 공통으로 소유한 Column 을 기준으로 Merge 를 수행할 수 있습니다.

    위 예시에서는 on="name" 를 통해 left_df 와 right_df 의 name 칼럼을 기준으로 Merge 를 적용합니다.

    반면, 두 DataFrame 이 공통의 Column 이 아닌 공통의 index 를 소유하는 경우가 존재합니다.

    예를 들면 아래와 같은 케이스입니다.

    set_index 함수를 사용하여 name 칼럼을 index 로 변경하였습니다.

    import pandas as pd
    
    left_data = [["Andy", 32],["Bob", 12],["Chris", 44],["Fabian", 25]]
    right_data = [["Andy", "Seoul"],["Bob", "LA"],["Chris", "Seoul"],["Daniel", "Tokyo"]]
    
    left_df = pd.DataFrame(left_data, columns=["name", "age"])
    left_df.set_index("name", inplace=True)
    right_df = pd.DataFrame(right_data, columns=["name", "city"])
    right_df.set_index("name", inplace=True)
    left_df is 
            age
    name       
    Andy     32
    Bob      12
    Chris    44
    Fabian   25
    
    right_df is 
             city
    name         
    Andy    Seoul
    Bob        LA
    Chris   Seoul
    Daniel  Tokyo

     

    이러한 경우에는 공통의 칼럼이 존재하지 않습니다.

    고로 index 를 기준으로 Join Operation 을 수행합니다.

    활용 예시는 아래와 같습니다.

    left_index=True & right_index=True 로 설정하여, 두 DataFrame 의 index 를 기준으로 pd.merge 를 수행합니다.

    import pandas as pd
    
    left_data = [["Andy", 32],["Bob", 12],["Chris", 44],["Fabian", 25]]
    right_data = [["Andy", "Seoul"],["Bob", "LA"],["Chris", "Seoul"],["Daniel", "Tokyo"]]
    
    left_df = pd.DataFrame(left_data, columns=["name", "age"])
    left_df.set_index("name", inplace=True)
    right_df = pd.DataFrame(right_data, columns=["name", "city"])
    right_df.set_index("name", inplace=True)
    
    merged_df = pd.merge(left_df, right_df, how="left", left_index=True, right_index=True)
    left_df is 
            age
    name       
    Andy     32
    Bob      12
    Chris    44
    Fabian   25
    
    right_df is 
             city
    name         
    Andy    Seoul
    Bob        LA
    Chris   Seoul
    Daniel  Tokyo
    
    merged_df is 
            age   city
    name              
    Andy     32  Seoul
    Bob      12     LA
    Chris    44  Seoul
    Fabian   25    NaN

     

    index 와 column 을 혼용하는 경우.

    하나의 DataFrame 은 index 기준으로 삼고, 다른 하나의 DataFrame 은 Column 을 기준으로 Merge Operation 을 수행할 수도 있습니다.

    가령 아래의 경우에는 left_df 는 index 에 name value 가 설정되어 있고, right_df 는 name 이라는 칼럼이 존재합니다.

    import pandas as pd
    
    left_data = [["Andy", 32],["Bob", 12],["Chris", 44],["Fabian", 25]]
    right_data = [["Andy", "Seoul"],["Bob", "LA"],["Chris", "Seoul"],["Daniel", "Tokyo"]]
    
    left_df = pd.DataFrame(left_data, columns=["name", "age"])
    left_df.set_index("name", inplace=True)
    right_df = pd.DataFrame(right_data, columns=["name", "city"])
    left_df is 
            age
    name       
    Andy     32
    Bob      12
    Chris    44
    Fabian   25
    
    right_df is 
         name   city
    0    Andy  Seoul
    1     Bob     LA
    2   Chris  Seoul
    3  Daniel  Tokyo

     

    이 경우에 left_df 의 index 와 right_df 의 name 칼럼을 기준으로 Join Operation 을 적용해야합니다.

    활용 예시는 아래와 같습니다.

    "left_index=True" 와 같이 설정하여 left_df 의 index 를 병합의 기준으로 사용합니다.

    "right_index=False", "right_on=name" 와 같이 설정하여 right_df 의 name 칼럼을 병합의 기준으로 사용합니다. 

    import pandas as pd
    
    left_data = [["Andy", 32],["Bob", 12],["Chris", 44],["Fabian", 25]]
    right_data = [["Andy", "Seoul"],["Bob", "LA"],["Chris", "Seoul"],["Daniel", "Tokyo"]]
    
    left_df = pd.DataFrame(left_data, columns=["name", "age"])
    left_df.set_index("name", inplace=True)
    right_df = pd.DataFrame(right_data, columns=["name", "city"])
    
    merged_df = pd.merge(
        left_df, 
        right_df, 
        how="left", 
        left_index=True, 
        right_index=False, 
        right_on="name")
    merged_df.reset_index(inplace=True, drop=True)
    left_df is 
            age
    name       
    Andy     32
    Bob      12
    Chris    44
    Fabian   25
    
    right_df is 
         name   city
    0    Andy  Seoul
    1     Bob     LA
    2   Chris  Seoul
    3  Daniel  Tokyo
    
    merged_df is 
       age    name   city
    0   32    Andy  Seoul
    1   12     Bob     LA
    2   44   Chris  Seoul
    3   25  Fabian    NaN

     

     

    반응형
Designed by Tistory.