ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] DataFrame concat 알아보기
    Python 2024. 3. 9. 22:44
    728x90
    반응형

     

    - 목차

     

    키워드.

    • concat
    • axis
    • ignore_index

     

    들어가며.

    Pandas 에서 여러개의 DataFrame 을 하나의 DataFrame 으로 병합하는 방법인 concat 함수이 대해서 알아보도록 하겠습니다.

    Pandas 의 다른 병합 기능인 merge 함수는 두개의 DataFrame 을 병합하는 Join Operation 을 수행합니다.

    반면, concat 함수는 두개 이상의 DataFrame 들을 하나의 거대한 DataFrame 으로 병합합니다.

    이는 Horizontal 또는 Vertical 한 두 방향으로 병합이 가능하며, Column 을 추가하거나 Row 를 추가하는 모든 병합을 제공합니다.

     

    기본적인 동작.

    기본적인 동작은 아래와 같습니다.

    아래와 같이 두개의 DataFrame 을 생성하고, pd.concat 함수를 통해서 두 DataFrame 을 병합합니다.

    import pandas as pd
    
    users1 = [["Andy", 32, "Seoul"], ["Bob", 12, "LA"], ["Chris", 44, "Seoul"], ["Daniel", 25, "Tokyo"]]
    users2 = [["Emma", 12, "Seoul"], ["Fabian", 84, "LA"], ["Gareth", 54, "Seoul"], ["Hayden", 15, "Tokyo"]]
    
    user1_df = pd.DataFrame(users1, columns=["name", "age", "city"])
    user2_df = pd.DataFrame(users2, columns=["name", "age", "city"])
    
    concated_df = pd.concat([user1_df, user2_df])
    =======user1_df======
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo
    =======user2_df======
         name  age   city
    0    Emma   12  Seoul
    1  Fabian   84     LA
    2  Gareth   54  Seoul
    3  Hayden   15  Tokyo
    =======concated_df===
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo
    0    Emma   12  Seoul
    1  Fabian   84     LA
    2  Gareth   54  Seoul
    3  Hayden   15  Tokyo

     

    위 결과와 같이 concated_dfuser1_dfuser2_df 의 데이터를 병합하였습니다.

    총 8개의 Row 를 가지는 DataFrame 으로 병합되었구요.

    원본 DataFrame 의 index 를 그대로 유지하기 때문에 concated_df 의 index 를 중복된 값이 존재합니다.

    이러한 중복 문제는 reset_index 함수로 해결할 수 있습니다.

     

    ignore_index.

    concat 함수에는 ignore_index 설정이 존재합니다.

    ignore_index 설정이 활성화되면, 병합된 DataFrame 의 index 는 0 부터 시작하는 RangeIndex 로 변경됩니다.

    import pandas as pd
    
    users1 = [["Andy", 32, "Seoul"], ["Bob", 12, "LA"], ["Chris", 44, "Seoul"], ["Daniel", 25, "Tokyo"]]
    users2 = [["Emma", 12, "Seoul"], ["Fabian", 84, "LA"], ["Gareth", 54, "Seoul"], ["Hayden", 15, "Tokyo"]]
    
    user1_df = pd.DataFrame(users1, columns=["name", "age", "city"])
    user2_df = pd.DataFrame(users2, columns=["name", "age", "city"])
    
    concated_df = pd.concat([user1_df, user2_df], ignore_index=True)
    =======user1_df======
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo
    =======user2_df======
         name  age   city
    0    Emma   12  Seoul
    1  Fabian   84     LA
    2  Gareth   54  Seoul
    3  Hayden   15  Tokyo
    =======concated_df===
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo
    4    Emma   12  Seoul
    5  Fabian   84     LA
    6  Gareth   54  Seoul
    7  Hayden   15  Tokyo

     

    만약 아래와 같이 'a', 'b', 'c', 'd' 와 같이 명시적으로 index 를 설정하더라도 ignore_index 설정으로 인해서 index 는 무시됩니다.

    import pandas as pd
    
    users1 = [["Andy", 32, "Seoul"], ["Bob", 12, "LA"], ["Chris", 44, "Seoul"], ["Daniel", 25, "Tokyo"]]
    users2 = [["Emma", 12, "Seoul"], ["Fabian", 84, "LA"], ["Gareth", 54, "Seoul"], ["Hayden", 15, "Tokyo"]]
    
    user1_df = pd.DataFrame(users1, columns=["name", "age", "city"], index=['a', 'b' ,'c', 'd'])
    user2_df = pd.DataFrame(users2, columns=["name", "age", "city"], index=['a', 'b' ,'c', 'd'])
    
    concated_df = pd.concat([user1_df, user2_df], ignore_index=True)
    =======user1_df======
         name  age   city
    a    Andy   32  Seoul
    b     Bob   12     LA
    c   Chris   44  Seoul
    d  Daniel   25  Tokyo
    =======user2_df======
         name  age   city
    a    Emma   12  Seoul
    b  Fabian   84     LA
    c  Gareth   54  Seoul
    d  Hayden   15  Tokyo
    =======concated_df===
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo
    4    Emma   12  Seoul
    5  Fabian   84     LA
    6  Gareth   54  Seoul
    7  Hayden   15  Tokyo

    axis.

    pd.concat 함수는 Horizontal 또는 Vertical 방향으로 병합을 수행할 수 있습니다.

    기본적인 동작인 axis=0 으로 설정되어 있구요. 이는 Vertical 방향으로 병합하여 Row 들이 추가됩니다.

     

    axis=1.

    axis 를 1 로 설정하면 Row 가 추가되는 것이 아닌 Column 이 추가됩니다.

    즉 Column 방향으로 두 DataFrame 이 병합됩니다.

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

    import pandas as pd
    
    users1 = [["Andy", 32, "Seoul"], ["Bob", 12, "LA"], ["Chris", 44, "Seoul"], ["Daniel", 25, "Tokyo"]]
    users2 = [["Emma", 12, "Seoul"], ["Fabian", 84, "LA"], ["Gareth", 54, "Seoul"], ["Hayden", 15, "Tokyo"]]
    
    user1_df = pd.DataFrame(users1, columns=["name", "age", "city"])
    user2_df = pd.DataFrame(users2, columns=["name", "age", "city"])
    
    concated_df = pd.concat([user1_df, user2_df], axis=1)
    concated_df.reset_index(inplace=True, drop=True)

     

    =======user1_df======
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo
    =======user2_df======
         name  age   city
    0    Emma   12  Seoul
    1  Fabian   84     LA
    2  Gareth   54  Seoul
    3  Hayden   15  Tokyo
    =======concated_df===
         name  age   city    name  age   city
    0    Andy   32  Seoul    Emma   12  Seoul
    1     Bob   12     LA  Fabian   84     LA
    2   Chris   44  Seoul  Gareth   54  Seoul
    3  Daniel   25  Tokyo  Hayden   15  Tokyo

     

    axis=1 인 경우에는 Column 이 추가됩니다. 그래서 중복되는 Column 명이 발생하게 됩니다.

     

    index 를 기준으로 병합하기.

    이번에는 axis=1 병합의 적절한 예시를 위해서 데이터를 변경하였습니다.

    name 이라는 공통된 칼럼을 가지지만, 추가적인 Column 이 다른 두 DataFrame 을 준비하였습니다.

    import pandas as pd
    
    users1 = [["Andy", 32, "Seoul"], ["Bob", 12, "LA"], ["Chris", 44, "Seoul"], ["Daniel", 25, "Tokyo"]]
    users2 = [["Andy", "Male"], ["Bob", "Male"], ["Chris", "Male"], ["Daniel", "Female"]]
    
    user1_df = pd.DataFrame(users1, columns=["name", "age", "city"])
    user2_df = pd.DataFrame(users2, columns=["name", "gender"])
    
    concated_df = pd.concat([user1_df, user2_df], axis=1)
    concated_df.reset_index(inplace=True, drop=True)
    =======user1_df======
         name  age   city
    0    Andy   32  Seoul
    1     Bob   12     LA
    2   Chris   44  Seoul
    3  Daniel   25  Tokyo
    =======user2_df======
         name  gender
    0    Andy    Male
    1     Bob    Male
    2   Chris    Male
    3  Daniel  Female
    =======concated_df===
         name  age   city    name  gender
    0    Andy   32  Seoul    Andy    Male
    1     Bob   12     LA     Bob    Male
    2   Chris   44  Seoul   Chris    Male
    3  Daniel   25  Tokyo  Daniel  Female

     

    병합 결과로써 age, city, gender 정보를 가지는 새로운 DataFrame 이 생성됩니다.

    다만 name 이라는 칼럼이 중복됩니다.

    이를 해결하기 위해서 index 를 기준으로 pd.concat 를 수행하는 예시를 작성해보겠습니다.

     

    set_index 함수를 통해서 name 칼럼을 DataFrame 의 index 로 변경합니다.

    이렇게 함으로써 두 DataFrame 은 중복되는 Column 이 사라집니다.

    그리고 pd.concat 함수를 사용하게 되면, index 를 기준으로 병합이 진행됩니다.

    import pandas as pd
    
    users1 = [["Andy", 32, "Seoul"], ["Bob", 12, "LA"], ["Chris", 44, "Seoul"], ["Daniel", 25, "Tokyo"]]
    users2 = [["Andy", "Male"], ["Bob", "Male"], ["Chris", "Male"], ["Daniel", "Female"]]
    
    user1_df = pd.DataFrame(users1, columns=["name", "age", "city"])
    user1_df.set_index("name", inplace=True)
    user2_df = pd.DataFrame(users2, columns=["name", "gender"])
    user2_df.set_index("name", inplace=True)
    
    concated_df = pd.concat([user1_df, user2_df], axis=1)
    =======user1_df======
            age   city
    name              
    Andy     32  Seoul
    Bob      12     LA
    Chris    44  Seoul
    Daniel   25  Tokyo
    =======user2_df======
            gender
    name          
    Andy      Male
    Bob       Male
    Chris     Male
    Daniel  Female
    =======concated_df===
            age   city  gender
    name                      
    Andy     32  Seoul    Male
    Bob      12     LA    Male
    Chris    44  Seoul    Male
    Daniel   25  Tokyo  Female

     

    위 결과와 같이 중복된 칼럼이 없이 병합이 수행됩니다.

     

     

    반응형
Designed by Tistory.