Python Pandas에서 두 데이터프레임을 인덱스 기준으로 병합하는 방법
Python Pandas에서 두 데이터프레임을 인덱스 기준으로 병합하는 방법
이 문서에서는 Python Pandas 라이브러리를 사용하여 두 데이터프레임을 인덱스 기준으로 병합하는 방법을 설명합니다. 두 가지 주요 방법인 merge
함수와 join
메서드를 다루며 각 방법의 장단점을 비교하고 실제 예제를 통해 구현 방법을 보여줍니다.
방법 1: merge 함수 사용
merge
함수는 두 데이터프레임을 병합하는 가장 일반적인 Pandas 함수입니다. 인덱스 기준 병합을 위해서는 다음과 같은 인수를 설정해야 합니다.
left_on
및right_on
: 병합 기준이 되는 왼쪽 및 오른쪽 데이터프레임의 인덱스 이름을 지정합니다.how
: 병합 유형을 지정합니다. 일반적으로'inner'
(교집합),'left'
(왼쪽 데이터프레임 기준),'right'
(오른쪽 데이터프레임 기준) 등을 사용합니다.
예시:
import pandas as pd
# 데이터프레임 생성
df_left = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']}, index=['x', 'y', 'z'])
df_right = pd.DataFrame({'C': [4, 5, 6], 'D': ['d', 'e', 'f']}, index=['x', 'y', 'z'])
# 인덱스 기준 병합
df_merged = pd.merge(left=df_left, right=df_right, how='inner', left_on=df_left.index, right_on=df_right.index)
# 결과 출력
print(df_merged)
출력:
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
방법 2: join 메서드 사용
join
메서드는 DataFrame 객체에 내장된 메서드로, 인덱스 기준 병합을 간편하게 수행할 수 있습니다. 다음과 같은 파라미터를 설정할 수 있습니다.
how
: 병합 유형을 지정합니다.merge
함수와 동일합니다.on
: 병합 기준이 되는 열 이름을 지정합니다. 기본적으로 인덱스를 사용하지만 다른 열을 지정할 수도 있습니다.
df_merged = df_left.join(df_right, how='inner', on=df_left.index)
# 결과 출력
print(df_merged)
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
방법 비교:
방법 | 장점 | 단점 |
---|---|---|
merge 함수 | - 다양한 병합 유형 지원<br>- 여러 병합 기준 설정 가능 | - 코드가 다소 복잡 |
join 메서드 | - 간결한 코드 | - 병합 유형 및 기준 설정 옵션 제한 |
주의 사항:
- 두 데이터프레임의 인덱스 이름과 순서가 일치해야 합니다.
- 병합 기준이 되는 열에 중복된 값이 있으면 결과가 예상과 다를 수 있습니다.
예제 코드
import pandas as pd
# 데이터프레임 생성
df_left = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']}, index=['x', 'y', 'z'])
df_right = pd.DataFrame({'C': [4, 5, 6], 'D': ['d', 'e', 'f']}, index=['x', 'y', 'z'])
# ## 방법 1: merge 함수 사용
# 인덱스 기준 병합
df_merged_merge = pd.merge(left=df_left, right=df_right, how='inner', left_on=df_left.index, right_on=df_right.index)
# 결과 출력
print(df_merged_merge)
# ## 방법 2: join 메서드 사용
# 인덱스 기준 병합
df_merged_join = df_left.join(df_right, how='inner', on=df_left.index)
# 결과 출력
print(df_merged_join)
# ## 추가 예시
# 1. 다른 병합 유형 사용
df_merged_left = pd.merge(left=df_left, right=df_right, how='left', left_on=df_left.index, right_on=df_right.index)
# 2. 다른 병합 기준 사용
df_merged_custom = pd.merge(left=df_left, right=df_right, how='inner', left_on='A', right_on='C')
# 방법 1 결과
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
# 방법 2 결과
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
# 추가 예시 1 결과
A B C D
0 1 a 4.0 d
1 2 b 5.0 e
2 3 c 6.0 f
# 추가 예시 2 결과
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
대체 방법
concat
함수는 두 데이터프레임을 축 기준으로 연결하는 함수입니다. 인덱스를 기준으로 병합하려면 axis=1
옵션을 사용해야 합니다.
df_merged_concat = pd.concat([df_left, df_right], axis=1)
# 결과 출력
print(df_merged_concat)
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
주의:
concat
함수는 인덱스가 일치하지 않더라도 연결합니다.- 연결된 데이터프레임의 인덱스가 일치하지 않으면 결과 데이터프레임의 인덱스는 연결된 순서대로 결정됩니다.
직접적인 열 병합:
만약 두 데이터프레임의 인덱스가 동일하고 열 이름이 충돌하지 않는다면, 다음과 같이 직접 열을 병합하여 새로운 데이터프레임을 만들 수도 있습니다.
df_merged_direct = pd.DataFrame()
df_merged_direct['A'] = df_left['A']
df_merged_direct['B'] = df_left['B']
df_merged_direct['C'] = df_right['C']
df_merged_direct['D'] = df_right['D']
# 결과 출력
print(df_merged_direct)
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
- 열 이름이 충돌하면 오류가 발생합니다.
itertools.chain 사용:
itertools.chain
함수를 사용하여 두 데이터프레임의 행을 순환하면서 새로운 데이터프레임을 만들 수 있습니다.
from itertools import chain
df_merged_chain = pd.DataFrame(chain(df_left.itertuples(), df_right.itertuples()))
# 결과 출력
print(df_merged_chain)
Index(['A', 'B', 'C', 'D'], dtype='object')
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
- 결과 데이터프레임의 인덱스는 0부터 시작합니다.
- 열 이름은 두 데이터프레임의 열 이름을 합친 순서대로 결정됩니다.
numpy.concatenate 사용:
import numpy as np
df_merged_numpy = pd.DataFrame(np.concatenate([df_left.to_numpy(), df_right.to_numpy()], axis=0))
# 결과 출력
print(df_merged_numpy)
A B C D
0 1 a 4 d
1 2 b 5 e
2 3 c 6 f
pd.DataFrame.append 사용:
pd.DataFrame.append
메서드를 사용하여 한 데이터프레임에 다른 데이터프레임을 추가하여 새로운 데이터프레임을 만들 수 있습니다.
df_merged_append = df_left.append(df_right)
# 결과 출력
print(df_merged_append)
A B C D
0 1 a NaN NaN
1 2 b NaN NaN
2 3 c NaN NaN
3 4 d NaN NaN
4 5 e NaN NaN
5 6 f NaN NaN
- 결과 데이터프레임의
python pandas dataframe