Python

[pandas] 데이터 병합 - merge, join

루루23 2024. 12. 6. 21:33
반응형

DataFrame.merge

DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=None, indicator=False, validate=None)

 

두 데이터프레임 또는 시리즈를 병합하여 하나의 데이터프레임 생성

시리즈의 경우 기본적으로 인덱스를 이용하여 병합

* 주의 두 키 컬럼에 null 값이 있을 경우, 해당 행끼리 매칭

 

Parameters:

1. right : 병합할 대상 DataFrame 또는 Series 객체

 

2. how (default 'inner') : 병합 방식 설정

  • 'left': 왼쪽 데이터프레임의 키만 사용
  • 'right': 오른쪽 데이터프레임의 키만 사용 
  • 'outer': 두 데이터프레임 키의 합집합 사용
  • 'inner': 두 데이터프레임 키의 교집합 사용
  • 'cross': 두 데이터프레임의 카테시안 곱

3. on (두 데이터프레임의 공통 컬럼이 기본값) : 병합할 키로 사용할 컬럼 또는 인덱스 이름

 

4. left_on, right_on : 각각 왼쪽/오른쪽 데이터프레임에서 병합 키로 사용할 컬럼의 이름이 다를 때 이용

 

5. left_index, right_index (default False) : 각각 왼쪽/오른쪽 데이터프레임의 인덱스를 병합 키로 사용할지 여부

 

6.sort (default False) : 병합된 결과에서 키를 사전순으로 정렬할지 여부

 

7. suffixes (default: ('_x', '_y') : 겹치는 컬럼 이름에 추가할 접미사 

 

8. copy (default True) : 복사 여부, False 설정 시 가능하면 복수를 피하기 때문에 원본 데이터프레임이 수정될 가능성이 있음

 

9. indicator (기본값: False) : 병합 정보 컬럼 추가

  • True : _merge 컬럼이 추가됨
  • _merge 값: left_only, right_only, both

10. validate : 병합 키에 대해 특정 타입 검증

예를 들어 one_to_one 병합을 기대했는데 실제로는 many_to_many 병합이 발생하면 오류 발생

 

  • 'one_to_one': 양쪽 키가 고유
  • 'one_to_many': 왼쪽 키가 고유, 오른쪽 키는 중복 가능
  • 'many_to_one': 오른쪽 키가 고유, 왼쪽 키는 중복 가능
  • 'many_to_many': 중복 허용

- Returns:  병합된 데이터프레임 (DataFrame)

 


DataFrame.join

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False, validate=None)

 

다른 DataFrame이나 Series의 컬럼을 현재 데이터프레임에 병합

기본적으로 인덱스-인덱스로 병합하며, 특정 컬럼(on)을 지정할 수도 있음

다중 병합 - 리스트로 여러 DataFrame을 한 번에 병합 가능

Parameters:

1. other : 병합 대상

  • DataFrame: 인덱스 기준 병합
  • Series: 병합 대상이 되는 시리즈는 이름(name)이 있어야 하며, 결과 데이터프레임에서 해당 이름이 컬럼 이름으로 사용됨.
  • 리스트: DataFrame 또는 Series의 리스트를 전달하면 여러 개를 동시에 병합 가능
import pandas as pd

# 다중 병합 예시
df1 = pd.DataFrame({'value1': [10, 20, 30]}, index=['A', 'B', 'C'])
df2 = pd.DataFrame({'value2': [15, 25, 35]}, index=['B', 'C', 'D'])
df3 = pd.DataFrame({'value3': [100, 200, 300]}, index=['A', 'B', 'C'])
result_multi = df1.join([df2, df3], how='outer')
print(result_multi)

# 결과
   value1  value2  value3
A    10.0     NaN   100.0
B    20.0    15.0   200.0
C    30.0    25.0   300.0
D     NaN    35.0     NaN

 

2. on : 병합 키

  • 값 유형: 문자열, 문자열 리스트, 배열
  • 다중 값일 경우, other는 MultiIndex여야 함

3. how  (default 'left'): 병합 방식 

  • 'left': 호출한 데이터프레임의 인덱스 또는 컬럼 기준.
  • 'right': 병합 대상(other)의 인덱스 기준.
  • 'outer': 두 데이터프레임의 인덱스 합집합.
  • 'inner': 두 데이터프레임의 인덱스 교집합.
  • 'cross': 두 데이터프레임의 카테시안 곱.

4. lsuffix, rsuffix : 컬럼 이름 구분하는 접미사

 

5. sort(기본값: False) : 병합 후 결과를 병합 키를 기준으로 정렬할지 여부

  • True: 결과를 사전순으로 정렬
  • False: 병합 방식(how)에 따라 정렬

6. validate : 병합 키 유효성 검증

  • 'one_to_one' 또는 '1:1': 양쪽 병합 키가 고유
  • 'one_to_many' 또는 '1:m': 왼쪽 키가 고유
  • 'many_to_one' 또는 'm:1': 오른쪽 키가 고유
  • 'many_to_many' 또는 'm:m': 중복 키 허용

Returns : 병합된 데이터프레임 (DataFrame)

반응형