-
[Pandas] DataFrame concat 알아보기Python 2024. 3. 9. 22:44728x90반응형
- 목차
키워드.
- 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_df 는 user1_df 와 user2_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
위 결과와 같이 중복된 칼럼이 없이 병합이 수행됩니다.
반응형'Python' 카테고리의 다른 글
[Python] yield 알아보기 ( generator ) (0) 2024.04.06 [Numpy] copy & view 알아보기 (Shallow, Deep Copy) (0) 2024.03.18 [Numpy] Boolean Indexing 알아보기 ( Boolean Mask ) (0) 2024.03.09 [Python] threading Condition 알아보기 ( wait, notify ) (0) 2024.03.09 [Python] io.BytesIO truncate 알아보기 (0) 2024.02.22