Pandas - 7. 데이터 병합 및 결합

2025. 2. 8. 12:27프로그래밍 (확장)/Python-Pandas

Pandas에서는 여러 개의 데이터프레임을 하나로 병합하거나 결합할 때 다양한 방법을 제공합니다. 이 문서에서는 concat()을 활용한 데이터 연결, merge()를 활용한 병합, 그리고 성능 최적화를 위한 기법들을 설명합니다.


1. 데이터 연결 (concat)

1.1 수직 결합

import pandas as pd

# 샘플 데이터 생성
df1 = pd.DataFrame({'이름': ['철수', '영희'], '성적': [85, 90]})
df2 = pd.DataFrame({'이름': ['민수', '지연'], '성적': [88, 76]})

# 수직 결합
df_concat = pd.concat([df1, df2], ignore_index=True)
print(df_concat)

1.2 수평 결합 시 인덱스 불일치 문제 해결

해결 방법: reset_index(drop=True) 적용

# 샘플 데이터 생성
df3 = pd.DataFrame({'이름': ['철수', '영희'], '국어': [85, 90]})
df4 = pd.DataFrame({'수학': [88, 95]}, index=[1, 2])  # 인덱스 불일치

# 해결 방안: reset_index(drop=True) 적용
df3_reset = df3.reset_index(drop=True)
df4_reset = df4.reset_index(drop=True)
df_horizontal_fixed = pd.concat([df3_reset, df4_reset], axis=1)
print(df_horizontal_fixed)

2. 데이터 병합 (merge)

2.1 관계 검증

병합 관계 유형 검증 (validate 옵션 활용)

data7 = pd.DataFrame({'이름': ['철수', '영희', '민수'], '국어': [85, 90, 88]})
data8 = pd.DataFrame({'이름': ['영희', '민수', '지연'], '수학': [95, 76, 89]})

# 1:1 관계 검증 (MergeError 방지)
df_validated = pd.merge(data7, data8, on='이름', how='inner', validate='one_to_one')
print(df_validated)

2.2 데이터 타입 불일치 문제 해결

부동소수점 오차 방지 (round() 활용)

df = pd.DataFrame({'rate': [1.234567, 2.345678, 3.456789]})
df['rate'] = df['rate'].round(3)  # 소수점 3자리까지 반올림
print(df)

3. 성능 최적화 기법

3.1 대용량 데이터 병합 최적화

정렬된 데이터를 병합할 때 sort=False 적용데이터 타입 변환 (convert_dtypes() 활용)

large_df1 = pd.DataFrame({'ID': range(100000), '값': range(100000)})
large_df2 = pd.DataFrame({'ID': range(50000, 150000), '값': range(50000, 150000)})

# 병합 시 정렬을 비활성화하여 성능 개선
optimized_merge = pd.merge(large_df1, large_df2, on='ID', how='inner', sort=False).convert_dtypes()
print(optimized_merge.info())

4. 오류 방지 체크리스트

병합 전 데이터 타입 일치 여부 확인 (df.info()) 적용

df.info()  # 데이터 타입 확인

중복 인덱스 검증 (verify_integrity=True)

df_merged = pd.merge(data7, data8, on='이름', how='inner', validate='one_to_one')
print(df_merged)

중복 컬럼명 방지 (suffixes=('_left', '_right'))

df_merged = pd.merge(data7, data8, on='이름', how='inner', suffixes=('_left', '_right'))
print(df_merged)

대용량 데이터셋(1GB 이상)은 Dask 병렬 처리 고려

# Dask를 활용한 병렬 처리
import dask.dataframe as dd
df_large = dd.read_csv('large_dataset.csv')
print(df_large.head())

이 문서는 Pandas에서 데이터 병합과 최적화된 성능을 유지하기 위한 주요 기법들을 다루었습니다. 위 내용을 활용하면 데이터 병합 시 발생할 수 있는 문제를 예방하고 보다 효율적인 데이터 처리가 가능합니다.