Pandas로 마스터하는 데이터 결합 및 병합 기법
데이터 분석 과정에서 서로 다른 데이터셋을 결합하는 작업은 필수적입니다. Python의 Pandas 라이브러리는 이러한 데이터 결합 작업을 위한 다양한 함수와 방법을 제공합니다. 이 글에서는 Pandas의 merge, concat, join 함수를 활용한 데이터 결합 방법과 실무에서 고려해야 할 사항들을 자세히 살펴보겠습니다.
1. Pandas의 데이터 결합 함수 개요
Pandas에서 제공하는 주요 데이터 결합 함수는 다음과 같습니다:
- merge: SQL의 JOIN과 유사한 방식으로 두 DataFrame을 결합
- concat: 여러 DataFrame을 행 또는 열 방향으로 단순 결합
- join: DataFrame의 인덱스를 기준으로 다른 DataFrame과 결합
2. merge 함수 활용하기
merge 함수는 SQL의 JOIN과 유사하게 동작하며, 두 DataFrame의 공통 열을 기준으로 데이터를 결합합니다.
기본 문법
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False)
merge 함수의 주요 매개변수
- left, right: 결합할 DataFrame
- how: 결합 방식 (‘inner’, ‘outer’, ‘left’, ‘right’)
- on: 결합 기준이 되는 열 이름
- left_on, right_on: 각 DataFrame에서 결합 기준이 되는 열 이름
- left_index, right_index: 인덱스를 기준으로 결합 여부
merge 활용 예제
import pandas as pd
# 예제 데이터 생성
employees = pd.DataFrame({
’emp_id’: [1, 2, 3, 4, 5],
‘name’: [‘Kim’, ‘Lee’, ‘Park’, ‘Choi’, ‘Jung’],
‘dept_id’: [10, 20, 10, 30, 20]
})
departments = pd.DataFrame({
‘dept_id’: [10, 20, 30, 40],
‘dept_name’: [‘HR’, ‘Development’, ‘Marketing’, ‘Sales’]
})
# 내부 조인(Inner Join)
inner_join = pd.merge(employees, departments, on=’dept_id’)
# 외부 조인(Outer Join)
outer_join = pd.merge(employees, departments, on=’dept_id’, how=’outer’)
# 왼쪽 조인(Left Join)
left_join = pd.merge(employees, departments, on=’dept_id’, how=’left’)
# 오른쪽 조인(Right Join)
right_join = pd.merge(employees, departments, on=’dept_id’, how=’right’)
3. concat 함수 활용하기
concat 함수는 여러 DataFrame을 행(axis=0) 또는 열(axis=1) 방향으로 단순히 연결합니다.
기본 문법
pd.concat(objs, axis=0, join='outer', ignore_index=False)
concat 함수의 주요 매개변수
- objs: 결합할 DataFrame들의 리스트
- axis: 결합 방향(0: 행 방향, 1: 열 방향)
- join: 결합 방식(‘outer’, ‘inner’)
- ignore_index: 기존 인덱스 무시 여부
concat 활용 예제
# 예제 데이터 생성
df1 = pd.DataFrame({‘A’: [‘A0’, ‘A1’], ‘B’: [‘B0’, ‘B1’]})
df2 = pd.DataFrame({‘A’: [‘A2’, ‘A3’], ‘B’: [‘B2’, ‘B3’]})
df3 = pd.DataFrame({‘C’: [‘C0’, ‘C1’], ‘D’: [‘D0’, ‘D1′]})
# 행 방향 결합(기본값)
row_concat = pd.concat([df1, df2])
# 열 방향 결합
col_concat = pd.concat([df1, df3], axis=1)
# 내부 조인 방식으로 결합
inner_concat = pd.concat([df1, df3], axis=1, join=’inner’)
# 인덱스 재설정
reset_index_concat = pd.concat([df1, df2], ignore_index=True)
4. join 메서드 활용하기
DataFrame의 join 메서드는 인덱스를 기준으로 다른 DataFrame과 결합합니다.
기본 문법
DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False)
join 메서드의 주요 매개변수
- other: 결합할 DataFrame
- on: 결합 기준이 되는 열 이름
- how: 결합 방식(‘left’, ‘right’, ‘outer’, ‘inner’)
- lsuffix, rsuffix: 중복 열 이름에 추가할 접미사
join 활용 예제
# 예제 데이터 생성
df1 = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K2’], ‘A’: [‘A0’, ‘A1’, ‘A2’], ‘B’: [‘B0’, ‘B1’, ‘B2’]})
df2 = pd.DataFrame({‘key’: [‘K0’, ‘K1’, ‘K3’], ‘C’: [‘C0’, ‘C1’, ‘C2’], ‘D’: [‘D0’, ‘D1’, ‘D2’]})
# 인덱스 설정
df1.set_index(‘key’, inplace=True)
df2.set_index(‘key’, inplace=True)
# 기본 join (left join)
left_join = df1.join(df2)
# inner join
inner_join = df1.join(df2, how=’inner’)
# outer join
outer_join = df1.join(df2, how=’outer’)
5. 실무에서의 데이터 병합 고려사항
1) 데이터 타입 일치 확인
결합하려는 열의 데이터 타입이 일치하지 않으면 예상치 못한 결과가 발생할 수 있습니다.
# 데이터 타입 확인
print(df1.dtypes)
print(df2.dtypes)
# 데이터 타입 변환
df2[‘join_key’] = df2[‘join_key’].astype(str)
2) 결측치 처리
데이터 결합 후 결측치가 발생할 수 있으므로, 결합 전후에 결측치 확인 및 처리가 필요합니다.
# 결합 후 결측치 확인
merged_df = pd.merge(df1, df2, on=’key’, how=’outer’)
print(merged_df.isnull().sum())
# 결측치 처리
merged_df.fillna(‘Unknown’, inplace=True)
3) 중복 데이터 확인
결합 키에 중복 값이 있는 경우, 데이터가 의도치 않게 증가할 수 있습니다.
# 중복 값 확인
print(df1[‘key’].duplicated().sum())
print(df2[‘key’].duplicated().sum())
# 결합 전후 행 수 비교
print(f”df1 행 수: {len(df1)}, df2 행 수: {len(df2)}”)
merged_df = pd.merge(df1, df2, on=’key’)
print(f”결합 후 행 수: {len(merged_df)}”)
4) 메모리 사용량 고려
대용량 데이터 결합 시 메모리 사용량이 급증할 수 있으므로 최적화가 필요합니다.
# 필요한 열만 선택하여 결합
df1_subset = df1[[‘key’, ‘value1’]]
df2_subset = df2[[‘key’, ‘value2′]]
merged_df = pd.merge(df1_subset, df2_subset, on=’key’)
# 청크 단위로 처리
chunk_size = 10000
reader1 = pd.read_csv(‘large_file1.csv’, chunksize=chunk_size)
reader2 = pd.read_csv(‘large_file2.csv’)
for chunk in reader1:
merged_chunk = pd.merge(chunk, reader2, on=’key’)
# 처리 로직…
5) 인덱스 관리
결합 후 인덱스가 의미를 잃거나 중복될 수 있으므로 적절한 인덱스 관리가 필요합니다.
# 결합 후 인덱스 재설정
merged_df = pd.merge(df1, df2, on=’key’)
merged_df.reset_index(drop=True, inplace=True)
# 의미 있는 열을 인덱스로 설정
merged_df.set_index(‘unique_id’, inplace=True)
6. 고급 데이터 결합 테크닉
1) 다중 키를 사용한 결합
# 여러 열을 기준으로 결합
pd.merge(df1, df2, on=[‘key1’, ‘key2’])
2) 접미사 활용하기
# 중복 열 이름에 접미사 추가
pd.merge(df1, df2, on=’key’, suffixes=(‘_left’, ‘_right’))
3) 인덱스와 열을 함께 사용한 결합
# df1의 인덱스와 df2의 ‘key’ 열을 기준으로 결합
pd.merge(df1, df2, left_index=True, right_on=’key’)
4) 교차 결합(Cross Join)
# 모든 행 조합 생성 (카티션 곱)
cross_join = pd.merge(df1, df2, how=’cross’)
7. 결론
Pandas의 데이터 결합 함수들은 각각 고유한 특성과 사용 사례가 있습니다. merge는 SQL의 JOIN과 유사하게 키 기반 결합에 적합하고, concat은 단순 행/열 결합에 유용하며, join은 인덱스 기반 결합에 효과적입니다.
실무에서는 데이터의 특성과 결합 목적에 따라 적절한 함수를 선택하고, 데이터 타입, 결측치, 중복 데이터, 메모리 사용량 등을 고려하여 효율적인 데이터 결합을 수행해야 합니다. 특히 대용량 데이터를 다룰 때는 최적화 전략이 중요합니다.
Pandas의 데이터 결합 기능을 마스터하면 복잡한 데이터 전처리 작업을 효율적으로 수행할 수 있으며, 이는 성공적인 데이터 분석의 기반이 됩니다.
답글 남기기