Python Pandas에서 여러 열을 기준으로 두 개의 데이터 프레임을 병합(조인)하는 방법
Python Pandas에서 여러 열을 기준으로 두 개의 데이터 프레임을 병합(조인)하는 방법
개요
이 문서에서는 **여러 열을 기준으로 두 개의 데이터 프레임을 병합(조인)**하는 방법에 대해 설명합니다.
필요한 라이브러리
import pandas as pd
예시 데이터
# 데이터 프레임 df1
df1 = pd.DataFrame({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"age": [20, 25, 30]
})
# 데이터 프레임 df2
df2 = pd.DataFrame({
"id": [1, 2, 4],
"city": ["Seoul", "New York", "London"],
"job": ["Software Engineer", "Data Scientist", "Doctor"]
})
여러 열을 기준으로 병합(조인)
merge()
함수를 사용하여 여러 열을 기준으로 두 개의 데이터 프레임을 병합할 수 있습니다.
# 공통 열 목록
common_columns = ["id"]
# 여러 열 기준 병합
df_merged = pd.merge(left=df1, right=df2, how="inner", on=common_columns)
print(df_merged)
# 결과
# id name age city job
# 0 1 Alice 20 Seoul Software Engineer
# 1 2 Bob 25 New York Data Scientist
옵션 설명:
how
: 병합 유형을 지정합니다.inner
: 공통 열을 가진 행만 병합합니다.left
: 왼쪽 데이터 프레임의 모든 행을 포함하고, 공통 열을 가진 오른쪽 데이터 프레임의 행을 병합합니다.outer
: 왼쪽 또는 오른쪽 데이터 프레임에 있는 모든 행을 포함합니다.
on
: 병합 기준 열을 지정합니다. 하나 또는 여러 열을 지정할 수 있습니다.
여러 열 기준 병합 시 주의 사항
- 병합 기준 열은 두 데이터 프레임에서 동일한 이름과 동일한 데이터 타입을 가져야 합니다.
- 병합 기준 열의 값은 유일해야 합니다.
추가 정보
관련 키워드
- python
- python-3.x
- pandas
- pandas merge
- pandas join
- 데이터 프레임 병합
예제 코드
# 데이터 프레임 df1
df1 = pd.DataFrame({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
"age": [20, 25, 30]
})
# 데이터 프레임 df2
df2 = pd.DataFrame({
"id": [1, 2, 4],
"city": ["Seoul", "New York", "London"],
"job": ["Software Engineer", "Data Scientist", "Doctor"]
})
# 여러 열 기준 병합
common_columns = ["id", "age"]
df_merged = pd.merge(left=df1, right=df2, how="inner", on=common_columns)
print(df_merged)
# 결과
# id name age city job
# 0 1 Alice 20 Seoul Software Engineer
# 1 2 Bob 25 New York Data Scientist
df1
과df2
는 서로 다른 열을 가지고 있는 두 개의 데이터 프레임입니다.common_columns
는 두 데이터 프레임에서 공통으로 가지고 있는 열 목록입니다.pd.merge()
함수는 두 데이터 프레임을common_columns
에 기준으로 병합합니다.how="inner"
옵션은 공통 열을 가진 행만 병합하도록 지정합니다.- 출력 결과는 병합된 데이터 프레임입니다.
참고:
- 여러 열 기준 병합 시, 두 데이터 프레임에서 공통으로 가지고 있는 열의 이름과 데이터 타입이 동일해야 합니다.
여러 열을 기준으로 두 개의 데이터 프레임을 병합(조인)하는 대체 방법
concat() 함수 사용
# 공통 열 목록
common_columns = ["id"]
# 데이터 프레임 병합
df_merged = pd.concat([df1, df2.set_index(common_columns)], axis=1, join="inner")
print(df_merged)
# 결과
# id name age city job
# 0 1 Alice 20 Seoul Software Engineer
# 1 2 Bob 25 New York Data Scientist
concat()
함수는 두 개의 데이터 프레임을 축(axis)에 따라 병합합니다.axis=1
은 열 방향으로 병합하도록 지정합니다.set_index()
함수는 데이터 프레임의 특정 열을 인덱스로 설정합니다.
주의:
concat()
함수는 병합 기준 열의 순서를 유지하지 않습니다.
for 루프 사용
# 공통 열 목록
common_columns = ["id"]
# 결과 데이터 프레임
df_merged = pd.DataFrame()
# for 루프를 사용하여 병합
for i in range(df1.shape[0]):
row1 = df1.iloc[i]
# 공통 열 값으로 df2에서 행 찾기
row2 = df2.loc[df2[common_columns[0]] == row1[common_columns[0]]]
# 두 행 병합
df_merged = df_merged.append(pd.concat([row1, row2], ignore_index=True))
print(df_merged)
# 결과
# id name age city job
# 0 1 Alice 20 Seoul Software Engineer
# 1 2 Bob 25 New York Data Scientist
설명:
- for 루프를 사용하여 두 데이터 프레임의 각 행을 비교합니다.
- 공통 열 값이 일치하는 행을 찾아 병합합니다.
ignore_index=True
옵션은 병합 후 인덱스를 다시 생성하도록 지정합니다.
- for 루프를 사용하는 방법은 느릴 수 있습니다.
itertools.product() 사용
from itertools import product
# 공통 열 목록
common_columns = ["id"]
# 결과 데이터 프레임
df_merged = pd.DataFrame()
# itertools.product() 사용하여 병합
for row1, row2 in product(df1.itertuples(), df2.itertuples()):
if row1[common_columns[0]] == row2[common_columns[0]]:
# 두 행 병합
df_merged = df_merged.append(pd.concat([row1._asdict(), row2._asdict()], ignore_index=True))
print(df_merged)
# 결과
# id name age city job
# 0 1 Alice 20 Seoul Software Engineer
# 1 2 Bob 25 New York Data Scientist
itertools.product()
함수는 두 데이터 프레임의 모든 행 조합을 생성합니다._asdict()
메서드는 namedtuple을 딕셔너리로 변환합니다.
itertools.product()
사용은 for 루프 사용보다 느릴 수 있습니다.
결론
여러 열을 기준으로 두 개의 데이터 프레임을 병합(조인)하는 방법은 여러 가지가 있습니다. 각 방법은 장단점이 있으며, 상황에 따라 적절한 방법을 선택해야 합니다.
merge()
함수는 가장 간편하고 효율적인 방법입니다.concat()
함수는 병합 기준 열의 순서를 유지하지 않지만, 간단하게 사용할 수 있습니다.- for 루프 또는
itertools.product()
사용은 유연하지만 느릴 수 있습니다.
python python-3.x pandas