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: 인덱스를 기준으로 데이터프레임을 병합할 때 사용합니다.

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

<h3>카테고리 다른 글</h3>
Date Title Author
Jan 1, 3000 전체 카테고리 gabriel yang
Oct 3, 2024 Pandas에서 Column 추가 및 삭제하는 방법 gabriel yang
Oct 3, 2024 Pandas 데이터프레임 mongodb에 저장하기 gabriel yang
Sep 21, 2024 Pandas에서 결측치(NaN) 처리하기 gabriel yang
Sep 11, 2024 Pandas SQL 쿼리 이용하기 gabriel yang
Aug 29, 2024 Pandas에서 데이터 형식 변경하기 gabriel yang
Aug 29, 2024 Pandas에서 데이터를 정렬하는 방법 gabriel yang
Aug 29, 2024 Pandas에서 인덱싱 및 슬라이싱하는 방법 gabriel yang
Aug 27, 2024 Pandas SQL 데이터베이스 읽어오기 gabriel yang
Aug 26, 2024 Pandas groupby 사용방법 gabriel yang
Aug 24, 2024 Pandas에서 melt를 사용해야 하는 데이터 유형과 사용 방법 gabriel yang
Aug 24, 2024 Pandas에서 pivot_table 사용하기 gabriel yang
Aug 24, 2024 Pandas에서 reset_index를 사용해야 하는 이유 gabriel yang
Aug 22, 2024 Pandas Excel과 CSV 파일을 읽어오는 방법 gabriel yang
Aug 19, 2024 Pandas DataFrame의 컬럼 이름 변경하기 gabriel yang
Aug 17, 2024 Pandas SettingWithCopyWarning 문제 해결 gabriel yang
Nov 30, 2023 Dataframe을 Dict로 생성 및 변환 gabriel yang
Nov 29, 2023 python datetime 사용법 정리 gabriel yang
Sep 14, 2023 Pandas 중복 데이터 제거하기 gabriel yang
No matching items
Back to BLOG LIST