Pandas에서 두 개의 데이터프레임을 연결하기

Pandas에서 두 개의 데이터프레임을 연결하기

Pandas
Pandas에서 두 개의 데이터프레임을 연결하기
Author

gabriel yang

Published

August 26, 2024

Pandas에서 두 개의 데이터프레임을 연결

데이터 분석을 하다 보면 두 개의 데이터프레임을 연결해야 할 때가 많습니다. Pandas는 이를 위해 여러 가지 방법을 제공합니다. 이 글에서는 concat, merge 등 Pandas에서 제공하는 다양한 연결 방법들을 설명하고, 각 방법의 사용 예시를 통해 어떤 상황에서 어떤 방법을 사용하는 것이 적합한지 알아보겠습니다.

import pandas as pd

# 예제 데이터프레임 생성
df1 = pd.DataFrame({
    'A': ['A0', 'A1', 'A2'],
    'B': ['B0', 'B1', 'B2']
})

df2 = pd.DataFrame({
    'A': ['A3'],
    'B': ['B3'],
    'C': ['C3']
})
display("Dataframe 1")
display(df1)
display("Dataframe 2")
display(df2)
'Dataframe 1'
A B
0 A0 B0
1 A1 B1
2 A2 B2
'Dataframe 2'
A B C
0 A3 B3 C3

예제로 사용하기 위한 데이터프레임을 생성합니다.

1. concat: 단순 연결

concat은 두 개 이상의 데이터프레임을 연결하는 가장 기본적인 방법입니다. 주로 행(row) 또는 열(column)을 기준으로 단순히 데이터를 이어붙일 때 사용됩니다.

1.1 행을 기준으로 연결하기

# 행 기준 연결
result = pd.concat([df1, df2], axis=0)
result
A B C
0 A0 B0 NaN
1 A1 B1 NaN
2 A2 B2 NaN
0 A3 B3 C3
  • axis=0: 데이터프레임을 행 기준으로 연결합니다. 정보가 없는 위치는 NaN값으로 추가가되며 기본값이므로 명시하지 않아도 됩니다.

1.2 열을 기준으로 연결하기

# 열 기준 연결
result = pd.concat([df1, df2], axis=1)
result
A B A B C
0 A0 B0 A3 B3 C3
1 A1 B1 NaN NaN NaN
2 A2 B2 NaN NaN NaN
  • axis=1: 데이터프레임을 열 기준으로 연결합니다.

1.3 인덱스 재설정하기

연결 후 인덱스를 다시 설정하여 고유한 인덱스를 부여할 수 있습니다.

# 행 기준 연결 후 인덱스 재설정
result = pd.concat([df1, df2], axis=0)
result
A B C
0 A0 B0 NaN
1 A1 B1 NaN
2 A2 B2 NaN
0 A3 B3 C3

ignore_index=True: 기존 인덱스를 무시하고 새로운 인덱스를 부여합니다. 위의 데이터 프레임은 기존의 데이터 프레임의 인덱스를 유지하고 있어 마지막 열의 인덱스가 0으로 표시됩니다.

# 행 기준 연결 후 인덱스 재설정
result = pd.concat([df1, df2], axis=0, ignore_index=True)
result
A B C
0 A0 B0 NaN
1 A1 B1 NaN
2 A2 B2 NaN
3 A3 B3 C3

2. merge: SQL 스타일의 병합

merge는 SQL의 JOIN 연산과 유사하게, 공통된 열을 기준으로 두 데이터프레임을 병합합니다. 이는 두 데이터프레임 간의 복잡한 관계를 연결할 때 유용합니다.

병합을 수행하기 위해서 key 열을 공통으로 갖는 2개의 데이터프레임을 생성합니다.

# 예제 데이터프레임 생성
df1 = pd.DataFrame({
    'key': ['K0', 'K1', 'K2'],
    'A': ['A0', 'A1', 'A2']
})
display("데이터프레임 1")
display(df1)

df2 = pd.DataFrame({
    'key': ['K0', 'K1', 'K3'],
    'B': ['B0', 'B1', 'B3']
})
display("데이터프레임 2")
display(df2)
'데이터프레임 1'
key A
0 K0 A0
1 K1 A1
2 K2 A2
'데이터프레임 2'
key B
0 K0 B0
1 K1 B1
2 K3 B3

2.1 기본 병합 (inner join)

inner join은 두 데이터프레임에서 공통된 키 값에 해당하는 행만을 반환합니다. 즉, 양쪽 데이터프레임에 모두 존재하는 키 값들에 대한 데이터만 포함됩니다.

# 기본 병합 (inner join)
result = pd.merge(df1, df2, on='key')
result
key A B
0 K0 A0 B0
1 K1 A1 B1
  • on='key': 공통된 열을 기준으로 병합합니다.
  • 기본적으로 inner join을 수행하여 공통된 키 값만 포함합니다.

반환된 데이터프레임의 크기는 병합한 두 데이터프레임에서 공통된 키 값의 수에 따라 달라집니다.두 개의 데이터프레임이 공통으로 갖는 key열에서 K0, K1을 갖는 행이 연결됩니다.

2.2 외부 병합 (outer join)

# 외부 병합 (outer join)
result = pd.merge(df1, df2, on='key', how='outer')
result
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 NaN
3 K3 NaN B3
  • how='outer': 모든 키 값을 포함하여 병합합니다. 일치하지 않는 값은 NaN으로 표시됩니다.

outer join은 두 데이터프레임의 모든 키 값을 포함하여 병합합니다. 공통된 키 값이 없으면, 해당하는 데이터는 NaN으로 채워집니다.

양쪽 데이터프레임의 모든 키 값을 포함하므로, 병합된 데이터프레임은 두 데이터프레임의 키 값의 합집합을 가지며 key열의 K2, K3는 각각 B열과 A열이 없기 때문에 NaN으로 설정됩니다.

2.3 왼쪽 병합 (left join)

left join은 왼쪽(첫 번째) 데이터프레임의 모든 키 값을 포함하여 병합합니다.

# 왼쪽 병합 (left join)
result = pd.merge(df1, df2, on='key', how='left')
result
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 NaN
  • how='left': 왼쪽 데이터프레임의 모든 키 값을 유지하며 병합합니다.

왼쪽 데이터프레임의 키 값에 대응하는 오른쪽 데이터프레임의 데이터가 없으면, 해당 데이터는 NaN으로 채워집니다. 반환된 데이터프레임의 키 값은 왼쪽 데이터프레임의 키 값에 기반합니다.

2.4 오른쪽 병합 (right join)

설명: right join은 오른쪽(두 번째) 데이터프레임의 모든 키 값을 포함하여 병합합니다.

# 오른쪽 병합 (right join)
result = pd.merge(df1, df2, on='key', how='right')
result
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K3 NaN B3
  • how='right': 오른쪽 데이터프레임의 모든 키 값을 유지하며 병합합니다.

오른쪽 데이터프레임의 키 값에 대응하는 왼쪽 데이터프레임의 데이터가 없으면, 해당 데이터는 NaN으로 채워집니다. 반환된 데이터프레임의 키 값은 오른쪽 데이터프레임의 키 값에 기반합니다.

4. 결론

Pandas에서 두 개의 데이터프레임을 연결하는 방법은 concat, merge, join 세 가지로 나뉩니다. 각 방법은 데이터프레임의 구조와 병합의 목적에 따라 적합한 방식이 달라집니다.

  • concat: 단순히 행이나 열을 이어붙일 때 사용합니다.
  • merge: 공통된 열을 기준으로 SQL 스타일의 복잡한 병합이 필요할 때 사용합니다.
  • join: 인덱스를 기준으로 데이터프레임을 병합할 때 사용합니다.

이러한 방법들을 적절히 사용하여 데이터프레임을 효과적으로 연결하고, 데이터 분석 작업을 더 쉽고 효율적으로 수행할 수 있습니다. 필요에 따라 다양한 옵션을 활용하여 원하는 결과를 얻어보세요!