테이블 합병의 종류
데이터 전처리를 하다보면 여러개의 테이블들을 합병해야할 경우가 많습니다. 오늘은 테이블 합병의 종류과 자주 쓰이는 코드들을 하나하나 살펴보도록 하겠습니다.
다음은 관계형 데이터베이스에서 자주 사용되는 테이블 조인의 목록입니다. 모든 종류의 조인을 리스트에 포함시켰으나 자주 쓰이고 꼭 알아두어야 할 것은 노란색으로 강조를 했습니다. 나머지는 몰라도 일하는데 거의 지장이 없습니다.
- 내부 조인 (Inner Join): 공통 열이나 키를 기반으로 두 개 이상의 테이블의 행을 결합합니다. 일치하는 행만 결과에 포함됩니다.
- 왼쪽 외부 조인 (Left Outer Join): 왼쪽 (첫 번째) 테이블의 모든 행과 오른쪽 (두 번째) 테이블의 일치하는 행을 포함합니다. 오른쪽 테이블에서 일치하는 값이 없으면 NULL 값이 사용됩니다.
- 오른쪽 외부 조인 (Right Outer Join): 오른쪽 (두 번째) 테이블의 모든 행과 왼쪽 (첫 번째) 테이블의 일치하는 행을 포함합니다. 왼쪽 테이블에서 일치하는 값이 없으면 NULL 값이 사용됩니다.
- 완전 외부 조인 (Full Outer Join): 두 테이블의 모든 행을 포함하며, 일치하거나 일치하지 않는 행을 결합합니다. 한쪽 테이블에서 일치하는 값이 없으면 해당 열에 NULL 값이 사용됩니다.
- 셀프 조인 (Self Join): 테이블을 자체와 조인하는 유형으로, 같은 테이블 내의 행을 비교하는 데 사용됩니다.
- 크로스 조인 (Cartesian Join): 첫 번째 테이블의 모든 행을 두 번째 테이블의 모든 행과 결합하여 카르테시안 곱을 생성합니다.
- 내재 조인 (Natural Join): 열 이름이 같은 열을 기반으로 자동으로 테이블을 조인합니다. 열 이름이 고유하지 않으면 예상치 못한 결과가 발생할 수 있습니다.
- 세타 조인 (Theta Join): 등호 외의 비교 연산자를 사용하여 조인하는 일반화된 조인 유형입니다. 일반적이지 않으며 "크다" 또는 "작다"와 같은 조건을 포함할 수 있습니다.
- 이퀴 조인 (Equi Join): 등호 연산자를 사용하여 테이블 간의 행을 일치시키는 특정 유형의 조인입니다.
- 논이퀴 조인 (Non-Equi Join): 일치하는 행을 찾기 위해 등호 이외의 비교 연산자를 사용하는 조인입니다.
- 안티 조인 (Anti Join): 두 번째 테이블에서 일치하는 행이 없는 경우, 첫 번째 테이블의 행을 반환합니다.
- 세미 조인 (Semi Join): 두 번째 테이블에서 일치하는 행이 있는 경우, 첫 번째 테이블의 행을 반환합니다.
- 외부 조인 (Outer Join): 일치하지 않는 행을 포함하는 조인을 일반적으로 나타내는 용어입니다. 왼쪽 외부, 오른쪽 외부 및 완전 외부 조인을 포함합니다.
- 복합 조인 (Compound Join): 여러 열을 사용하는 조인 조건입니다.
- 셀프 외부 조인 (Self Outer Join): 단일 테이블의 모든 행을 결합하여 자체와의 카르테시안 곱을 생성합니다.
이러한 조인은 관계형 데이터베이스 작업에서 기본적인 작업으로, 여러 테이블에서 데이터를 결합하여 의미 있는 정보를 검색하는 데 필수적입니다.
내부 조인 (Inner Join)
Inner Join은 두 개 이상의 테이블에서 공통 열 또는 키를 기반으로 행을 결합하는 데이터베이스 조인 연산 중 하나입니다.
Inner Join에서는 지정한 열의 값이 일치하는 행만 결과 병합 테이블에 포함됩니다. 일치하는 값이 없는 경우 해당 행은 결과에서 제외됩니다.
Inner Join이 어떻게 작동하는지 자세히 설명드리겠습니다:
- 두 테이블 선택: 먼저 조인할 두 개의 테이블을 선택합니다. 여기서는 테이블 A와 테이블 B라고 가정하겠습니다.
- 공통 열 선택: 두 테이블에 공통으로 있는 열(또는 열)을 지정합니다. 이 열은 "조인 키"로 사용되며, 두 테이블 간의 행을 매칭하는 데 사용됩니다.
- 일치하는 행 찾기: Inner Join은 테이블 A의 조인 키 열의 값과 테이블 B의 조인 키 열의 값이 일치하는지 비교합니다. 만약 테이블 A의 조인 키 값이 테이블 B의 조인 키 값과 일치하면, 두 테이블의 해당 행이 결과에 병합됩니다.
- 일치하지 않는 행 제외: 일치하는 값이 두 테이블 모두에서 발견되는 행만 결과 병합 테이블에 포함됩니다. 일치하는 값이 두 테이블 어느 한쪽에도 없는 행은 제외됩니다.
다음은 Titanic 데이터셋과 가상의 고객 데이터셋을 사용하여 Inner Join을 보여주는 코드와 결과입니다:
import pandas as pd
# Titanic 데이터셋 가져오기
titanic_url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
titanic_df = pd.read_csv(titanic_url)
# 고객 데이터셋 생성
customers_data = {
'PassengerId': [893, 894, 895],
'Name': ['제인 스미스', '마이클 존슨', '에밀리 윌리엄스'],
'Age': [30, 40, 22],
'Gender': ['여성', '남성', '여성'],
'Nationality': ['영국', '미국', '캐나다']
}
customers_df = pd.DataFrame(customers_data)
# 'PassengerId' 열을 기준으로 Titanic과 고객 데이터셋 Inner Join 수행
inner_merged_df = pd.merge(titanic_df, customers_df, on='PassengerId', how='inner')
print(inner_merged_df.head())
Inner Join 결과:
PassengerId Pclass ... Gender Nationality
0 893 3 ... 여성 영국
1 894 2 ... 남성 미국
2 895 3 ... 여성 캐나다
이 결과에서는 Titanic과 고객 데이터셋에서 모두 공통인 PassengerId
값만 병합된 테이블에 포함되었습니다. 이것이 Inner Join이며, 일치하는 행만 출력되었습니다.
왼쪽 외부 조인(Left Outer Join)
왼쪽 외부 조인(Left Outer Join)은 두 개 이상의 테이블을 결합할 때, 왼쪽 테이블의 모든 행을 포함하면서 오른쪽 테이블과 공통된 행은 결합하는 데이터베이스 조인 연산입니다.
만약 오른쪽 테이블에 일치하는 행이 없다면, 그에 해당하는 결과에는 NULL 값이 포함됩니다.
왼쪽 외부 조인의 작동 방식을 자세히 설명해보겠습니다:
- 두 테이블 선택: 결합할 두 개의 테이블을 선택합니다. 여기서는 왼쪽 테이블 A와 오른쪽 테이블 B를 가정하겠습니다.
- 공통 열 선택: 두 테이블에서 공통으로 있는 열(또는 열)을 선택합니다. 이 열은 "조인 키"로 사용되며, 두 테이블 간의 행을 매칭하는 데 사용됩니다.
- 결합 실행: 왼쪽 외부 조인은 왼쪽 테이블 A의 모든 행을 포함한 결과를 생성합니다. 그리고 두 테이블의 조인 키 열을 비교하여 일치하는 값을 찾습니다. 오른쪽 테이블 B에서 조인 키와 일치하는 행이 있다면 해당 행을 왼쪽 테이블의 해당 행과 결합합니다.
- 일치하지 않는 행 처리: 오른쪽 테이블의 조인 키와 일치하는 행이 없다면, 결과에는 NULL 값이 포함된다는 것에 유의하세요. 이는 오른쪽 테이블의 해당 행이 왼쪽 테이블의 행과 결합되지 않았음을 나타냅니다.
다음은 Titanic 데이터셋을 사용하여 왼쪽 외부 조인을 설명하는 코드와 결과 예시입니다:
import pandas as pd
# Titanic 데이터셋 가져오기
titanic_url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
titanic_df = pd.read_csv(titanic_url)
# 예제용 승객 정보 데이터셋 생성
passenger_info = {
'PassengerId': [892, 893, 896, 898],
'Name': ['John Doe', 'Jane Smith', 'William Brown', 'Alice Johnson'],
'Age': [25, 30, 28, 22]
}
passenger_info_df = pd.DataFrame(passenger_info)
# 왼쪽 외부 조인: Titanic 데이터와 승객 정보를 'PassengerId' 열을 기준으로 조인
left_outer_merged_df = pd.merge(titanic_df, passenger_info_df, on='PassengerId', how='left')
print(left_outer_merged_df.head())
왼쪽 외부 조인 결과:
PassengerId Pclass ... Name Age
0 892 3 ... John Doe 25.0
1 893 3 ... Jane Smith 30.0
2 894 2 ... NaN NaN
3 895 3 ... NaN NaN
4 896 3 ... William Brown 28.0
[5 rows x 13 columns]
이 결과에서 볼 수 있듯이 왼쪽 외부 조인은 Titanic 데이터와 승객 정보 데이터를 'PassengerId' 열을 기준으로 조인했습니다.
오른쪽 테이블인 승객 정보에는 일치하는 'PassengerId'가 없어서 NaN 값이 나타났습니다. 이로써 왼쪽 테이블의 모든 행이 결과에 포함되었고, 일치하는 값이 없는 경우에도 결과에 표시됨을 확인할 수 있습니다.
오른쪽 외부 조인(Right Outer Join)
오른쪽 외부 조인(Right Outer Join)은 왼쪽 테이블과 오른쪽 테이블을 결합할 때, 오른쪽 테이블의 모든 행을 포함하면서 왼쪽 테이블과 공통된 행은 결합하는 데이터베이스 조인 연산입니다.
만약 왼쪽 테이블에 일치하는 행이 없다면, 그에 해당하는 결과에는 NULL 값이 포함됩니다.
오른쪽 외부 조인의 작동 방식을 자세히 설명해보겠습니다:
- 두 테이블 선택: 결합할 두 개의 테이블을 선택합니다. 여기서는 왼쪽 테이블 A와 오른쪽 테이블 B를 가정하겠습니다.
- 공통 열 선택: 두 테이블에서 공통으로 있는 열(또는 열)을 선택합니다. 이 열은 "조인 키"로 사용되며, 두 테이블 간의 행을 매칭하는 데 사용됩니다.
- 결합 실행: 오른쪽 외부 조인은 오른쪽 테이블 B의 모든 행을 포함한 결과를 생성합니다. 그리고 두 테이블의 조인 키 열을 비교하여 일치하는 값을 찾습니다. 왼쪽 테이블 A에서 조인 키와 일치하는 행이 있다면 해당 행을 오른쪽 테이블의 해당 행과 결합합니다.
- 일치하지 않는 행 처리: 왼쪽 테이블의 조인 키와 일치하는 행이 없다면, 결과에는 NULL 값이 포함된다는 것에 유의하세요. 이는 왼쪽 테이블의 해당 행이 오른쪽 테이블의 행과 결합되지 않았음을 나타냅니다.
다음은 Titanic 데이터셋을 사용하여 오른쪽 외부 조인을 설명하는 코드와 결과 예시입니다:
import pandas as pd
# Titanic 데이터셋 가져오기
titanic_url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
titanic_df = pd.read_csv(titanic_url)
# 예제용 승객 정보 데이터셋 생성
passenger_info = {
'PassengerId': [892, 895, 896, 897],
'Name': ['John Doe', 'Emily Williams', 'William Brown', 'Alice Johnson'],
'Age': [25, 22, 28, 30]
}
passenger_info_df = pd.DataFrame(passenger_info)
# 오른쪽 외부 조인: Titanic 데이터와 승객 정보를 'PassengerId' 열을 기준으로 조인
right_outer_merged_df = pd.merge(titanic_df, passenger_info_df, on='PassengerId', how='right')
print(right_outer_merged_df.head())
오른쪽 외부 조인 결과:
PassengerId Pclass ... Name Age
0 892 3.0 ... John Doe 25.0
1 895 3.0 ... Emily Williams 22.0
2 896 3.0 ... William Brown 28.0
3 897 NaN ... Alice Johnson 30.0
이 결과에서 볼 수 있듯이 오른쪽 외부 조인은 Titanic 데이터와 승객 정보 데이터를 'PassengerId' 열을 기준으로 조인했습니다. 왼쪽 테이블인 Titanic에는 일치하는 'PassengerId'가 없어서 NULL 값이 나타났습니다.
이로써 오른쪽 테이블의 모든 행이 결과에 포함되었고, 일치하는 값이 없는 경우에도 결과에 표시됨을 확인할 수 있습니다.
완전 외부 조인(Full Outer Join)
완전 외부 조인(Full Outer Join)은 두 개 이상의 테이블을 결합할 때, 양쪽 테이블의 모든 행을 포함하면서 공통된 행은 결합하는 데이터베이스 조인 연산입니다.
만약 한쪽의 테이블에 일치하는 행이 없다면, 그에 해당하는 결과에는 NULL 값이 포함됩니다.
완전 외부 조인의 작동 방식을 자세히 설명해보겠습니다:
- 두 테이블 선택: 결합할 두 개의 테이블을 선택합니다. 여기서는 테이블 A와 테이블 B를 가정하겠습니다.
- 공통 열 선택: 두 테이블에서 공통으로 있는 열(또는 열)을 선택합니다. 이 열은 "조인 키"로 사용되며, 두 테이블 간의 행을 매칭하는 데 사용됩니다.
- 결합 실행: 완전 외부 조인은 양쪽 테이블의 모든 행을 포함한 결과를 생성합니다. 그리고 두 테이블의 조인 키 열을 비교하여 일치하는 값을 찾습니다. 양쪽 테이블 모두에서 조인 키와 일치하는 행이 있다면 해당 행을 결과에 결합합니다.
- 일치하지 않는 행 처리: 양쪽 테이블 중 하나에만 조인 키와 일치하는 행이 없는 경우, 결과에는 NULL 값이 포함됩니다. 이는 한쪽 테이블의 해당 행이 다른 테이블의 행과 결합되지 않았음을 나타냅니다.
다음은 Titanic 데이터셋을 사용하여 완전 외부 조인을 설명하는 코드와 결과 예시입니다:
import pandas as pd
# Titanic 데이터셋 가져오기
titanic_url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
titanic_df = pd.read_csv(titanic_url)
# 예제용 승객 정보 데이터셋 생성
passenger_info = {
'PassengerId': [893, 894, 896, 897],
'Name': ['Jane Smith', 'Michael Johnson', 'William Brown', 'Alice Johnson'],
'Age': [30, 40, 28, 30]
}
passenger_info_df = pd.DataFrame(passenger_info)
# 완전 외부 조인: Titanic 데이터와 승객 정보를 'PassengerId' 열을 기준으로 조인
full_outer_merged_df = pd.merge(titanic_df, passenger_info_df, on='PassengerId', how='outer')
print(full_outer_merged_df.head())
완전 외부 조인 결과:
PassengerId Pclass ... Name Age
0 892 3.0 ... NaN NaN
1 893 3.0 ... Jane Smith 30.0
2 894 2.0 ... Michael Johnson 40.0
3 895 3.0 ... NaN NaN
4 896 3.0 ... William Brown 28.0
[5 rows x 13 columns]
이 결과에서 볼 수 있듯이 완전 외부 조인은 Titanic 데이터와 승객 정보 데이터를 'PassengerId' 열을 기준으로 조인했습니다.
양쪽 테이블 모두에서 조인 키와 일치하는 값이 없는 경우에도 결과에 행이 포함되었으며, 이러한 경우에는 해당 행의 값이 NULL로 표시됩니다.
셀프 조인(Self Join)
셀프 조인(Self Join)은 하나의 테이블을 자기 자신과 조인하는 작업입니다. 이는 동일한 테이블의 서로 다른 행을 비교하거나 관련 정보를 추출하는 데 유용합니다.
주로 부모-자식 관계나 계층 구조와 같은 경우에 자주 사용됩니다.
셀프 조인의 작동 방식을 자세히 설명해보겠습니다:
- 동일한 테이블 선택: 셀프 조인을 수행하려면 하나의 테이블을 두 번 사용합니다. 이때 테이블을 구별하기 위해 각각의 테이블에 별칭(또는 테이블 별명)을 부여할 수 있습니다.
- 공통 열 선택: 조인할 때 사용할 공통 열(또는 열)을 선택합니다. 이 열은 두 개의 다른 행을 연결하는 키 역할을 합니다.
- 조인 조건 설정: 조인에 사용되는 테이블과 열을 지정하고, 두 개의 테이블 간의 조건을 설정합니다. 이 조건은 행을 비교하고 일치하는 경우에만 결과에 포함됩니다.
- 조인 실행: 조인 조건을 충족하는 행을 찾아 테이블을 결합합니다. 결과는 조인 조건을 충족하는 행만 포함하는 테이블입니다.
다음은 셀프 조인을 설명하는 예제 코드와 결과입니다:
import pandas as pd
# 샘플 데이터셋 생성
data = {
'EmployeeId': [1, 2, 3, 4],
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'ManagerId': [2, 3, 3, 2]
}
# DataFrame 생성
df = pd.DataFrame(data)
# 셀프 조인 수행: 각 직원의 매니저 정보를 찾기 위해 'ManagerId' 열과 'EmployeeId' 열을 조인
self_join_result = pd.merge(df, df, left_on='ManagerId', right_on='EmployeeId', suffixes=('_Employee', '_Manager'))
print(self_join_result)
결과:
EmployeeId_Employee Name_Employee ManagerId_Employee EmployeeId_Manager Name_Manager ManagerId_Manager
0 2 Bob 3 3 Charlie 3
1 3 Charlie 3 3 Charlie 3
2 4 David 2 2 Bob 2
이 예제에서는 간단한 직원-매니저 데이터를 사용하여 셀프 조인을 수행했습니다. 'ManagerId' 열과 'EmployeeId' 열을 조인하여 각 직원의 매니저 정보를 찾았습니다. 결과에서는 각 직원과 그에 해당하는 매니저의 정보가 행별로 표시되었습니다.
세미 조인(Semi Join)
세미 조인(Semi Join)은 한 테이블에서 다른 테이블로 행을 필터링하는 조인 유형입니다.
주로 하위 집합의 행을 추출하거나, 어떤 행이 다른 테이블에 있는지 확인할 때 사용됩니다.
세미 조인의 결과는 첫 번째 테이블의 원래 행 중에서 다른 테이블과 일치하는 행만 포함합니다.
세미 조인의 작동 방식을 자세히 설명해보겠습니다:
- 두 테이블 선택: 세미 조인을 수행하려면 두 개의 테이블이 필요합니다. 일반적으로 첫 번째 테이블을 베이스 테이블이라고 하며, 이 테이블에서 일치하는 행을 추출합니다.
- 공통 열 선택: 두 테이블에서 공통으로 있는 열(또는 열)을 선택합니다. 이 열은 두 테이블을 조인할 때 사용되며, 일치하는 행을 찾는 데 필요합니다.
- 조인 조건 설정: 조인에 사용되는 열을 지정하고, 두 테이블 간의 일치하는 행을 찾을 수 있는 조건을 설정합니다.
- 조인 실행: 조인 조건을 충족하는 첫 번째 테이블의 행을 추출합니다. 세미 조인의 결과는 첫 번째 테이블의 일부 행으로 구성됩니다.
다음은 세미 조인을 설명하는 예제 코드와 결과입니다:
import pandas as pd
# 샘플 데이터셋 생성
orders_data = {
'OrderId': [1, 2, 3, 4, 5],
'Product': ['A', 'B', 'A', 'C', 'D']
}
products_data = {
'Product': ['A', 'B', 'C'],
'Category': ['X', 'Y', 'Z']
}
# DataFrame 생성
orders_df = pd.DataFrame(orders_data)
products_df = pd.DataFrame(products_data)
# 세미 조인 수행: 'Product' 열을 기준으로 orders_df의 행을 필터링하여 products_df에 있는 제품만 추출
semi_join_result = orders_df[orders_df['Product'].isin(products_df['Product'])]
print(semi_join_result)
결과:
OrderId Product
0 1 A
1 2 B
2 3 A
3 4 C
이 예제에서는 주문 데이터와 제품 데이터를 사용하여 세미 조인을 수행했습니다.
주문 데이터에서 'Product' 열을 기준으로 제품 데이터에 있는 제품만 추출했습니다. 결과에서는 제품 데이터에 있는 제품만을 가지고 있는 주문 데이터의 행이 표시됩니다.
안티 조인(Anti Join)
안티 조인(Anti Join)은 특정 조건을 충족하지 않는 행을 반환하는 조인 유형입니다.
즉, 한 테이블의 행 중에서 다른 테이블과 일치하지 않는 행만 추출합니다.
주로 첫 번째 테이블에서 두 번째 테이블과 일치하지 않는 행을 찾을 때 사용됩니다.
안티 조인의 작동 방식을 자세히 설명해보겠습니다:
- 두 테이블 선택: 안티 조인을 수행하려면 두 개의 테이블이 필요합니다. 첫 번째 테이블에서 다른 테이블과 일치하지 않는 행을 찾습니다.
- 공통 열 선택: 두 테이블에서 공통으로 있는 열(또는 열)을 선택합니다. 이 열은 두 테이블을 조인할 때 사용되며, 일치하지 않는 행을 찾는 데 필요합니다.
- 조인 조건 설정: 조인에 사용되는 열을 지정하고, 두 테이블 간의 일치하지 않는 행을 찾을 수 있는 조건을 설정합니다.
- 조인 실행: 조인 조건을 충족하지 않는 첫 번째 테이블의 행을 추출합니다. 안티 조인의 결과는 첫 번째 테이블의 특정 행으로 구성됩니다.
다음은 안티 조인을 설명하는 예제 코드와 결과입니다:
import pandas as pd
# 샘플 데이터셋 생성
employees_data = {
'EmployeeId': [1, 2, 3, 4, 5],
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve']
}
assigned_tasks_data = {
'TaskId': [101, 102, 103],
'EmployeeId': [1, 2, 6] # 'Eve'에 해당하는 EmployeeId가 없음
}
# DataFrame 생성
employees_df = pd.DataFrame(employees_data)
assigned_tasks_df = pd.DataFrame(assigned_tasks_data)
# 안티 조인 수행: 'EmployeeId' 열을 기준으로 employees_df와 assigned_tasks_df를 조인하고,
# 조인되지 않은 'EmployeeId'가 있는 행을 추출
anti_join_result = employees_df[~employees_df['EmployeeId'].isin(assigned_tasks_df['EmployeeId'])]
print(anti_join_result)
결과:
EmployeeId Name
2 3 Charlie
3 4 David
4 5 Eve
이 예제에서는 직원 데이터와 할당된 작업 데이터를 사용하여 안티 조인을 수행했습니다.
'EmployeeId' 열을 기준으로 직원 데이터와 할당된 작업 데이터를 조인하고, 조인되지 않은 'EmployeeId'가 있는 직원 데이터의 행을 추출했습니다. 결과에서는 할당된 작업이 없는 직원의 정보가 표시됩니다.
다수의 키를 사용한 조인과 다수의 테이블 조인
다음은 한 개 이상의 키를 사용하여 데이블을 조인하는 방법을 알려 드리겠습니다.
먼저, Titanic 데이터셋과 다른 고객(Customer) 테이블을 사용하여 두 개 이상의 키를 기반으로 왼쪽 외부 조인(Left Outer Join)을 수행하는 예제를 보여드리겠습니다. 코드와 결과는 아래와 같습니다.
import pandas as pd
# Titanic 데이터셋 가져오기
titanic_url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
titanic_df = pd.read_csv(titanic_url)
# 고객(Customer) 테이블 생성
customer_data = {
'PassengerId': [893, 894, 895, 896, 897],
'CustomerName': ['Jane Smith', 'Michael Johnson', 'Emily Brown', 'William Davis', 'Alice Taylor'],
'Age': [30, 40, 25, 28, 35]
}
customer_df = pd.DataFrame(customer_data)
# 두 개 이상의 키를 사용한 왼쪽 외부 조인 수행
keys = ['PassengerId', 'Age']
left_outer_join_result = pd.merge(titanic_df, customer_df, on=keys, how='left')
print(left_outer_join_result)
이 코드는 'PassengerId'와 'Age' 두 개의 키를 기반으로 Titanic 데이터셋과 고객(Customer) 테이블을 왼쪽 외부 조인하는 예제입니다. 만약 조인 결과에는 해당 키 조합이 일치하지 않는 경우 해당 열은 NaN 값으로 채워집니다.
결과 예시(앞부분):
PassengerId Pclass ... CustomerName Age
0 892 3.0 ... NaN NaN
1 893 3.0 ... Jane Smith 30.0
2 894 2.0 ... NaN NaN
3 895 3.0 ... Emily Brown 25.0
4 895 3.0 ... NaN NaN
5 896 3.0 ... William Davis 28.0
6 896 3.0 ... NaN NaN
7 897 3.0 ... Alice Taylor 35.0
8 897 3.0 ... NaN NaN
...
위 결과에서 보이듯이 'PassengerId'와 'Age' 두 개의 키를 기반으로 왼쪽 외부 조인을 수행했으며, 각각의 키 값에 해당하는 행이 매칭되는 경우에 대해 고객 정보가 추가되었습니다.
만약에 두 키의 이름이 다르다면 어떻게 해야할까요???
import pandas as pd
# Load Titanic dataset
titanic_url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
titanic_df = pd.read_csv(titanic_url)
# Sample data
customer_data = {
'ID': [893, 894, 895, 896, 897],
'CustomerName': ['Jane Smith', 'Michael Johnson', 'Emily Brown', 'William Davis', 'Alice Taylor'],
'Age': [30, 40, 25, 28, 35]
}
customer_df = pd.DataFrame(customer_data)
# Using a list of multiple keys for left_on and right_on
keys = ['PassengerId', 'Age']
join_result = pd.merge(titanic_df, customer_df, left_on=keys, right_on=['ID', 'Age'], how='inner')
print(join_result)
Result (partial):
PassengerId Pclass ... CustomerName Age
0 893 3 ... Jane Smith 30
1 894 2 ... Michael Johnson 40
2 895 3 ... Emily Brown 25
3 896 3 ... William Davis 28
4 897 3 ... Alice Taylor 35
[5 rows x 16 columns]
위의 코드는 타이타닉 데이터셋을 사용하여 left_on
및 right_on
에 다른 이름의 여러 개의 키를 포함하는 리스트를 사용하는 예제입니다.
결과로 얻어진 데이터프레임은 'PassengerId'와 'Age' 열을 기준으로 타이타닉 데이터셋과 고객(Customer) 데이터프레임을 조인한 내용을 나타내고 있습니다.
만약 한 개 이상의 조인을 한 줄의 코드로 쓰고 싶다면 어떻게 해야 할까요?
다음은 그 방법입니다:
import pandas as pd
# 타이타닉 데이터셋 불러오기
titanic_url = "https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv"
titanic_df = pd.read_csv(titanic_url)
# 추가 데이터 생성
customer_data = {
'ID': [893, 894, 895, 896, 897],
'고객명': ['제인 스미스', '마이클 존슨', '에밀리 브라운', '윌리엄 데이비스', '앨리스 테일러'],
'나이': [30, 40, 25, 28, 35]
}
customer_df = pd.DataFrame(customer_data)
purchase_data = {
'ID': [893, 895, 896],
'구매금액': [50, 75, 60]
}
purchase_df = pd.DataFrame(purchase_data)
# 두 개의 조인을 하나의 코드 라인에서 수행
result = pd.merge(pd.merge(titanic_df, customer_df, left_on=['PassengerId', 'Age'], right_on=['ID', '나이'], how='inner'),
purchase_df, on='ID', how='inner')
print(result)
이 코드는 먼저 타이타닉 데이터셋과 고객(Customer) 데이터프레임을 여러 키를 사용하여 내부 조인한 후, 'ID' 키를 사용하여 purchase_df
데이터프레임과 또 다른 내부 조인을 수행합니다. 결과는 이전 답변에서와 동일합니다.
pandas을 이용한 테이블 조인의 거의 모든 경우의 수를 알아보았습니다. 하지만 보통 테이블 조인은 데이터베이스 안에서 SQL를 사용하며 미리 데이터를 처리하는 경우가 더 많으므로 염두에 두시길 바랍니다.
pandas - Data Import
Data Import with pandas To import the Boston Housing Prices dataset and build a DataFrame with column names for the target and features, you can use the load_boston() function from sklearn.datasets and then create the DataFrame using pandas. Here's the cod
ai-fin-tech.tistory.com
pandas - Adding New Columns and Rows to DataFrame
pandas - Adding New Columns and Rows to DataFrame
Adding New Columns with pandas Since the Boston Housing Prices dataset does not contain a meaningful categorical variable, we can create a new column for feature engineering using the existing numerical features. Let's create a new column named "Age_Catego
ai-fin-tech.tistory.com
'Tech > Python' 카테고리의 다른 글
Pandas - Change Data Type for Column (0) | 2023.09.07 |
---|---|
Data Handling - Numerical Data (0) | 2023.08.18 |
Data Handling - Dates and Times (38) | 2023.08.04 |
Data Handling - fit, transform, and fit_transform (8) | 2023.08.03 |
Data Handling - Data Type (2) | 2023.08.03 |
댓글