-
[Pandas] DataFrame pd.merge 알아보기 (Join)Python 2024. 4. 9. 06:40728x90반응형
- 목차
키워드.
- 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
반응형'Python' 카테고리의 다른 글
[Pandas] DataFrame loc, iloc 알아보기 (0) 2024.04.19 [Pandas] Boolean Indexing 알아보기 (0) 2024.04.15 [Python] yield 알아보기 ( generator ) (0) 2024.04.06 [Numpy] copy & view 알아보기 (Shallow, Deep Copy) (0) 2024.03.18 [Pandas] DataFrame concat 알아보기 (0) 2024.03.09