데이터 정제 작업 중, 두 컬럼을 비교해서 한쪽이 비어 있으면 다른 값으로 채워야 할 때가 있습니다. 이때 fillna()를 주로 사용하지만, 인덱스가 다른 상황에서는 combine_first()가 더 안전한 선택입니다. 이번 글에서는 두 메서드의 차이를 예제로 비교하면서, 어떤 상황에 어떤 함수를 쓰면 좋은지 정리해보겠습니다.
combine_first() 기본 개념
combine_first()는 두 Series(DataFrame 포함)를 결합하여, 앞쪽 값이 결측치(NaN)일 경우 뒤쪽 값으로 채워주는 메서드입니다. 즉, "왼쪽 값을 우선 사용하고, 비어 있으면 오른쪽 값으로 보충"하는 방식으로 작동합니다.
예제 코드
import pandas as pd
df = pd.DataFrame({
'고객명': ['홍길동', None, '이몽룡'],
'이름': ['길동이', '성춘향', None]
})
df['고객명'].combine_first(df['이름'])
0 홍길동
1 성춘향
2 이몽룡
Name: 고객명, dtype: object
- 0번: '고객명' 값이 있으므로 그대로 유지
- 1번: '고객명'이 비었으므로 '이름'의 값으로 채움
- 2번: '고객명' 유지
fillna와의 차이점
| 비교 항목 | fillna | combine_first |
| 기본 동작 | NaN만 채움 | NaN 채움 + 인덱스 합집합 고려 |
| 인덱스 다를 때 | 무시 | 자동 정렬 후 병합 |
| 반환 결과 | 원본 인덱스 기준 | 두 Series의 union 인덱스 기준 |
예제 코드
s1 = pd.Series(['홍길동', None, '이몽룡'], index=[0, 1, 2])
s2 = pd.Series(['길동이', '성춘향'], index=[1, 3])
print("fillna 결과:\n", s1.fillna(s2))
print("\ncombine_first 결과:\n", s1.combine_first(s2))
fillna 결과:
0 홍길동
1 NaN
2 이몽룡
dtype: object
combine_first 결과:
0 홍길동
1 길동이
2 이몽룡
3 성춘향
dtype: object
- fillna: 같은 인덱스만 채우므로 1번은 비어 있음
- combine_first: 인덱스 합집합으로 병합해 3번 인덱스까지 반영
정리
- 인덱스가 완전히 동일한 Series끼리는 fillna()와 combine_first() 결과가 동일
- 하지만 인덱스가 다를 수 있는 경우에는 combine_first()가 더 안전
- 일반적인 DataFrame 내부 컬럼 결합이라면 인덱스가 일치하므로 fillna()로 충분하며 속도도 더 빠릅니다.