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)
예제로 사용하기 위한 데이터프레임을 생성합니다.
1. concat
: 단순 연결
concat
은 두 개 이상의 데이터프레임을 연결하는 가장 기본적인 방법입니다. 주로 행(row) 또는 열(column)을 기준으로 단순히 데이터를 이어붙일 때 사용됩니다.
1.1 행을 기준으로 연결하기
# 행 기준 연결
result = pd.concat([df1, df2], axis= 0 )
result
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
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
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
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)
2.1 기본 병합 (inner join
)
inner join은 두 데이터프레임에서 공통된 키 값에 해당하는 행만을 반환합니다. 즉, 양쪽 데이터프레임에 모두 존재하는 키 값들에 대한 데이터만 포함됩니다.
# 기본 병합 (inner join)
result = pd.merge(df1, df2, on= 'key' )
result
on='key'
: 공통된 열을 기준으로 병합합니다.
기본적으로 inner join
을 수행하여 공통된 키 값만 포함합니다.
반환된 데이터프레임의 크기는 병합한 두 데이터프레임에서 공통된 키 값의 수에 따라 달라집니다.두 개의 데이터프레임이 공통으로 갖는 key
열에서 K0
, K1
을 갖는 행이 연결됩니다.
2.2 외부 병합 (outer join
)
# 외부 병합 (outer join)
result = pd.merge(df1, df2, on= 'key' , how= 'outer' )
result
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
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
0
K0
A0
B0
1
K1
A1
B1
2
K3
NaN
B3
how='right'
: 오른쪽 데이터프레임의 모든 키 값을 유지하며 병합합니다.
오른쪽 데이터프레임의 키 값에 대응하는 왼쪽 데이터프레임의 데이터가 없으면, 해당 데이터는 NaN으로 채워집니다. 반환된 데이터프레임의 키 값은 오른쪽 데이터프레임의 키 값에 기반합니다.
4. 결론
Pandas에서 두 개의 데이터프레임을 연결하는 방법은 concat
, merge
, join
세 가지로 나뉩니다. 각 방법은 데이터프레임의 구조와 병합의 목적에 따라 적합한 방식이 달라집니다.
concat
: 단순히 행이나 열을 이어붙일 때 사용합니다.
merge
: 공통된 열을 기준으로 SQL 스타일의 복잡한 병합이 필요할 때 사용합니다.
join
: 인덱스를 기준으로 데이터프레임을 병합할 때 사용합니다.
이러한 방법들을 적절히 사용하여 데이터프레임을 효과적으로 연결하고, 데이터 분석 작업을 더 쉽고 효율적으로 수행할 수 있습니다. 필요에 따라 다양한 옵션을 활용하여 원하는 결과를 얻어보세요!