메뉴 닫기

파이썬 pandas combine_first로 결측치 보완 좌측 우선 병합 완벽 가이드

파이썬 pandas combine_first로 결측치 보완 좌측 우선 병합 완벽 가이드

🧩 한 번에 이해하는 결측치 결합 원리와 실무 예제

데이터 전처리를 하다 보면 테이블은 같은데 값이 듬성듬성 비어 있어 분석이 자꾸 막히는 순간이 찾아옵니다.
열 이름은 맞는데 일부 행만 비어 있거나, 보조 데이터프레임에만 값이 있는 경우도 낯설지 않죠.
이때 가장 깔끔하게 해결해 주는 방법 중 하나가 바로 좌측을 우선으로 비어 있는 값을 다른 소스로 메우는 전략입니다.
pandas에서는 combine_first가 그 역할을 정확히 수행합니다.
왼쪽 객체의 값이 있으면 그대로 두고, 결측치일 때만 오른쪽의 대응 값을 가져와 채우는 방식이라 안전합니다.
중복 덮어쓰기 위험을 줄이고, 인덱스와 열 정렬을 자동으로 맞춰 주기 때문에 초보자도 실수 없이 신뢰도 높은 테이블을 만들 수 있습니다.

이 글은 파이썬 pandas > 결측치 처리 > 결합: combine_first — 좌측 우선 병합으로 결측 보충이라는 실전 주제를 중심으로 핵심 개념과 올바른 사용법을 정리합니다.
비슷해 보이는 fillnaupdate와 무엇이 다른지, 인덱스가 서로 다를 때 어떻게 정렬되어 결합되는지, 성능과 자료형 보존은 어떤 영향을 받는지도 함께 살펴봅니다.
실무에서 자주 마주치는 고객 마스터 보강, 월별 통계 보정, 로그와 기준값 결합 같은 사례까지 담아 한 번 배워두면 다양한 데이터셋에 곧바로 응용할 수 있도록 구성했습니다.



🧠 combine_first 핵심 개념과 동작 방식

combine_first는 좌측 데이터의 값을 최우선으로 보존하고, 결측치일 때에만 우측 데이터의 동일 위치 값을 채워 넣는 결합 함수입니다.
인덱스와 열을 기준으로 정렬을 맞춘 뒤 병합하므로, 양쪽의 모양이 달라도 공통 축을 중심으로 자연스럽게 보완됩니다.
핵심은 ‘비어 있으면 오른쪽으로 보충, 값이 있으면 그대로 유지’라는 규칙입니다.
즉, 기존 분석 결과를 망치지 않으면서도 누락된 셀만 안전하게 메울 수 있어, 결측치 처리의 기본 도구로 널리 쓰입니다.
이 글의 주제인 파이썬 pandas > 결측치 처리 > 결합: combine_first — 좌측 우선 병합으로 결측 보충의 정확한 정의가 바로 여기에 담겨 있습니다.

🧠 좌측 우선 규칙의 의미

좌측 우선이란, 왼쪽 객체(DataFrame 또는 Series)의 비결측 값은 어떤 경우에도 우측 값으로 덮어쓰지 않는다는 뜻입니다.
따라서 기존 데이터 신뢰도를 유지하면서도 비어 있는 셀만 선택적으로 채울 수 있습니다.
이 방식은 update처럼 무조건 덮어쓰는 동작과 다르고, fillna처럼 단일 스칼라나 매핑으로 채우는 것과도 차별화됩니다.
또한 병합 시 인덱스와 컬럼이 합집합으로 정렬되며, 좌측에 없는 축은 새로운 축으로 추가되어 결과가 넓어질 수 있습니다.

🧠 동작 대상과 결측 판정

대상은 DataFrameSeries 모두이며, 결측은 일반적으로 NaN, None 등 누락값으로 판정됩니다.
문자열의 빈 문자열(“”)이나 0 같은 유효값은 결측으로 간주되지 않으므로 우측 값으로 대체되지 않습니다.
반면 좌측이 결측인 위치에서만 우측의 동일 좌표 값이 들어와 채워집니다.
연산은 비파괴적이며, 원본을 변경하지 않고 새로운 객체를 반환합니다.

CODE BLOCK
import pandas as pd

left = pd.DataFrame({
    "id": [1, 2, 3],
    "name": ["Kim", "Lee", None],
    "score": [90, None, 85]
}).set_index("id")

right = pd.DataFrame({
    "id": [1, 2, 3],
    "name": [None, "Lee", "Park"],
    "score": [None, 88, None]
}).set_index("id")

out = left.combine_first(right)

# 결과 요약
# id=1: name "Kim" 유지, score 90 유지 (좌측이 이미 값 보유)
# id=2: name "Lee" 유지, score 결측이라 88로 보충
# id=3: name 결측이라 "Park"로 보충, score 85 유지

💡 TIP: 열 또는 인덱스가 서로 다른 경우에도 combine_first는 축을 자동 정렬합니다.
좌측에 없는 열이 우측에만 있으면 결과에 새 열로 추가될 수 있습니다.
반대로 좌측에만 있는 열은 그대로 유지되어 안전하게 확장됩니다.

⚠️ 주의: dtype은 결측 보완 과정에서 상위 호환 타입으로 승격될 수 있습니다(예: int → float).
또한 좌측 값이 0이나 빈 문자열처럼 “거짓”으로 평가되더라도 결측이 아니면 우측 값으로 대체되지 않습니다.

🧠 Series에서도 동일하게 적용

Series 간에도 로직은 동일합니다.
좌측의 결측 위치에 한해 우측 값을 채우며, 인덱스가 다르면 합집합으로 정렬된 뒤 매칭되는 레이블 기준으로 보완됩니다.
이 특성 덕분에 지표 시계열에서 특정 기간의 누락분을 보조 시계열로 메우거나, 기준 테이블의 키를 바탕으로 속성 값을 보충하는 데 유용합니다.

CODE BLOCK
s1 = pd.Series({"A": 1.0, "B": None, "C": 3.0})
s2 = pd.Series({"B": 2.0, "C": None, "D": 4.0})

s_out = s1.combine_first(s2)
# A=1.0 유지, B=2.0으로 보완, C=3.0 유지, D는 새 인덱스로 추가되어 4.0

🛠️ DataFrame과 Series에서의 사용법

실제 데이터 전처리 과정에서 combine_firstDataFrameSeries 모두에 적용할 수 있습니다.
두 객체 모두 인덱스와 컬럼을 기준으로 정렬한 뒤 좌측 결측치만 보완되며, 반환은 새로운 객체로 이루어집니다.
이 덕분에 원본 데이터를 손상시키지 않고 여러 시도를 통해 결측치 처리 전략을 실험할 수 있습니다.

🛠️ DataFrame 활용

DataFrame에서 combine_first는 좌측의 결측 셀만 채우며, 좌측 값이 존재한다면 그대로 유지됩니다.
결합 결과는 좌측과 우측의 인덱스와 컬럼을 합집합으로 가지며, 비어 있던 좌측 셀만 우측 값으로 보완됩니다.

CODE BLOCK
df1 = pd.DataFrame({
    "A": [1, None, 3],
    "B": [4, 5, None]
})

df2 = pd.DataFrame({
    "A": [None, 2, None],
    "B": [None, None, 6],
    "C": [7, 8, 9]
})

df_out = df1.combine_first(df2)

# 결과:
# A 열은 [1, 2, 3]
# B 열은 [4, 5, 6]
# C 열은 [7, 8, 9] (새로운 열 추가)

🛠️ Series 활용

Series에서는 인덱스 기준으로 좌측 값이 채워지며, 좌측 결측 위치에만 우측 값이 반영됩니다.
또한 두 Series의 인덱스가 달라도 자동으로 합집합으로 정렬되기 때문에 새로운 키 값이 자연스럽게 추가됩니다.

CODE BLOCK
s1 = pd.Series([10, None, 30], index=["x", "y", "z"])
s2 = pd.Series([20, 25, 35], index=["y", "z", "w"])

s_out = s1.combine_first(s2)

# 결과:
# x = 10 (유지)
# y = 25 (보충)
# z = 30 (유지)
# w = 35 (새로운 인덱스 추가)

💎 핵심 포인트:
DataFrame과 Series 모두에서 combine_first는 좌측 객체를 기준으로 보존하면서 결측만 채운다는 점이 동일합니다.
좌측의 신뢰도를 유지한 채 필요한 값만 보완할 수 있다는 점에서 매우 직관적이고 안정적인 기능입니다.



🧮 fillna update combine과의 차이점

pandas에서 결측치 처리나 데이터 병합을 할 때 흔히 사용하는 함수로는 fillna, update, 그리고 combine이 있습니다.
겉보기에는 모두 비슷하게 보일 수 있지만, 동작 방식과 결과물에는 중요한 차이가 있습니다.
특히 이 글의 주제인 combine_first는 이들과 구별되는 고유한 규칙을 가집니다.

🧮 fillna와의 차이

fillna는 특정 값(스칼라, 딕셔너리, 메소드 등)으로 결측치를 채우는 기능입니다.
즉, 외부 객체와 결합하는 개념이 아니라, 내부적으로 값만 대체하는 것입니다.
반면 combine_first는 다른 객체를 기반으로 결측치를 채우기 때문에, 보다 유연하게 두 데이터프레임을 보완할 수 있습니다.

🧮 update와의 차이

update는 좌측 객체를 직접 수정하면서 우측 값을 덮어씁니다.
좌측에 값이 있더라도 우측에 값이 존재하면 그대로 교체되므로, 데이터가 손상될 위험이 있습니다.
또한 반환값이 없고, 원본을 변경하는 특성이 있어 주의해야 합니다.
반대로 combine_first는 원본을 보존하며 새로운 객체를 반환하고, 좌측 값이 존재하면 절대 덮어쓰지 않습니다.

🧮 combine과의 차이

combine은 두 객체를 사용자 정의 함수로 결합할 수 있도록 한 범용 함수입니다.
즉, 셀 단위의 비교와 보완 로직을 직접 정의해야 합니다.
이와 달리 combine_first는 이미 ‘좌측 우선, 우측 보완’이라는 규칙이 내장된 특수한 형태로, 실무에서 바로 활용하기 쉽습니다.

메서드 특징
fillna 단일 값으로 결측치 채움, 외부 객체 사용 불가
update 원본 수정, 좌측 값도 덮어쓸 수 있음
combine 사용자 정의 함수로 결합 로직 지정 가능
combine_first 좌측 우선, 결측치만 우측 값으로 보완, 새로운 객체 반환

💬 정리하면, combine_first는 안전하게 좌측 데이터를 보존하면서 결측치만 보완하는 특화된 함수라는 점에서 fillna, update, combine과 명확히 구분됩니다.

🗂️ 인덱스와 열 정렬 성능 및 주의사항

combine_first는 단순히 결측치를 채우는 기능을 넘어, 인덱스와 컬럼을 합집합으로 정렬하여 결과를 반환합니다.
이는 데이터 정합성을 높이는 장점이 있지만, 데이터 크기가 커질수록 성능 부담으로 이어질 수 있습니다.
특히 수십만 행 이상의 대규모 데이터셋을 다룰 때는 메모리 사용량과 실행 속도를 반드시 고려해야 합니다.

🗂️ 인덱스 정렬 동작

좌측과 우측의 인덱스가 다르면 합집합을 기준으로 정렬됩니다.
좌측에 없는 인덱스는 결과에 새로 추가되며, 좌측에만 있는 인덱스는 그대로 유지됩니다.
이 과정에서 순서가 달라질 수 있으므로, 정렬을 유지하고 싶다면 결합 전에 인덱스를 미리 맞춰 두는 것이 안전합니다.

CODE BLOCK
df1 = pd.DataFrame({"val": [1, None]}, index=["a", "b"])
df2 = pd.DataFrame({"val": [2, 3]}, index=["b", "c"])

df_out = df1.combine_first(df2)

# 결과 인덱스 = ["a", "b", "c"]
# a → 1 유지
# b → None → 2로 보완
# c → 3 (새로운 인덱스 추가)

🗂️ 열 정렬 동작

열 또한 좌측과 우측의 합집합으로 구성되며, 좌측에 없던 열은 새 열로 추가됩니다.
반대로 좌측에만 존재하던 열은 유지됩니다.
이때 우측 열이 새로 추가될 수 있기 때문에 결과가 예상보다 넓어질 수 있습니다.
데이터 구조가 바뀌면 후속 처리 코드에 영향을 줄 수 있으므로 반드시 확인이 필요합니다.

⚠️ 주의: 열이나 인덱스가 합집합으로 늘어나면서 dtype이 강제로 변환될 수 있습니다.
예를 들어 int 컬럼이 NaN을 만나면 float로 승격됩니다.
필요한 경우 astype을 사용해 후처리해야 합니다.

🗂️ 성능 최적화 팁

  • 인덱스가 클 경우, 미리 정렬 후 결합하면 성능 개선 효과
  • 🧹불필요한 열은 결합 전에 drop하여 결과 크기 축소
  • 📦여러 번 반복 호출 대신 병합 전략을 한 번에 적용



💡 실무 예제 결측치 보완 패턴

combine_first는 단순한 예제뿐만 아니라 실무에서도 자주 활용됩니다.
특히 고객 마스터 정보 보강, 월별 통계값 보정, 로그와 기준 데이터 결합 같은 케이스에서 빛을 발합니다.
좌측 데이터를 기준으로 안전하게 보존하면서 필요한 값만 채워 넣기 때문에 데이터 손상 위험이 낮고, 반복 사용에도 안정적입니다.

💡 고객 마스터 정보 보강

CRM이나 ERP 데이터를 다룰 때, 일부 고객 정보가 빠져 있는 경우가 있습니다.
예를 들어 신규 고객 DB에는 주소가 없지만, 과거 구매 이력에는 주소가 저장되어 있을 수 있습니다.
이때 좌측을 신규 DB로, 우측을 보조 DB로 두고 combine_first를 적용하면 누락된 필드를 간단히 보강할 수 있습니다.

💡 월별 통계 데이터 보정

월별 지표를 수집하다 보면 특정 달의 값이 비어 있을 때가 있습니다.
이럴 때는 별도로 계산된 보조 지표를 우측에 두고 combine_first로 결합하면 누락된 값만 자연스럽게 채워집니다.
이 방식은 좌측 데이터의 일관성을 유지하면서 결측치만 보완할 수 있다는 점에서 보고서 작성에 유리합니다.

CODE BLOCK
monthly_main = pd.Series(
    [100, None, 120, None],
    index=["Jan", "Feb", "Mar", "Apr"]
)

monthly_backup = pd.Series(
    [95, 110, 125, 130],
    index=["Jan", "Feb", "Mar", "Apr"]
)

monthly_out = monthly_main.combine_first(monthly_backup)
# 결과: [100, 110, 120, 130]

💡 로그 데이터와 기준값 결합

웹 로그나 IoT 센서 데이터에는 결측치가 흔합니다.
하지만 기준값 테이블에는 정상 범위나 기본 값이 저장되어 있는 경우가 많습니다.
이럴 때는 로그 데이터를 좌측에 두고, 기준값 테이블을 우측에 두어 결측만 보완하면 분석이 원활해집니다.
특히 대규모 센서 데이터에서 빠진 측정값을 보강할 때 효과적입니다.

💎 핵심 포인트:
실무에서 combine_first는 단순 결측 보완을 넘어, 보조 데이터 소스를 활용한 데이터 품질 향상에 강력한 도구로 쓰입니다.
좌측을 신뢰할 수 있는 원본으로 두고, 필요한 값만 우측에서 가져온다는 사고방식이 안정성을 보장합니다.

자주 묻는 질문 (FAQ)

combine_first는 inplace 옵션이 있나요?
아닙니다. combine_first는 항상 새로운 객체를 반환하며, 원본은 수정되지 않습니다.
좌측 값이 0이나 빈 문자열일 경우도 우측 값으로 대체되나요?
아니요. 0이나 빈 문자열은 유효한 값으로 간주되므로 우측 값으로 덮어쓰지 않습니다.
combine_first와 fillna 중 어느 것이 더 빠른가요?
단순 스칼라 치환이라면 fillna가 빠르지만, 두 객체를 결합해 보완할 때는 combine_first가 더 직관적입니다.
대규모 데이터프레임에서도 안전하게 사용할 수 있나요?
가능합니다. 다만 인덱스와 열이 합집합으로 확장되기 때문에 메모리 사용량이 증가할 수 있어 주의가 필요합니다.
update와 차이점은 무엇인가요?
update는 원본을 수정하고 좌측 값도 덮어쓸 수 있지만, combine_first는 원본을 보존하며 좌측 값이 있는 경우 절대 덮어쓰지 않습니다.
Series와 DataFrame 모두에서 같은 방식으로 동작하나요?
네. 두 경우 모두 좌측의 결측치에 한해 우측 값을 보완하고, 인덱스는 합집합으로 정렬됩니다.
결측치가 NaN이 아니라 None일 때도 동작하나요?
네. pandas는 None도 결측치로 인식하기 때문에 동일하게 처리됩니다.
dtype 변환은 어떻게 처리되나요?
결측치 보완 과정에서 더 일반적인 dtype으로 변환될 수 있습니다. 예를 들어 int 열이 NaN을 만나면 float로 변환됩니다.

📌 좌측 우선 병합으로 결측치 보완 정리

이번 글에서는 pandas에서 결측치를 다루는 핵심 함수인 combine_first를 정리했습니다.
이 함수는 좌측 값을 우선 보존하고, 결측치일 경우에만 우측 값을 채워 넣는 방식으로 동작합니다.
따라서 원본 데이터의 신뢰성을 유지하면서도 필요한 부분만 보완할 수 있어 안정적입니다.
fillna, update, combine과의 차이점도 살펴보았으며, 특히 원본 보존과 좌측 우선 규칙이 중요한 특징으로 확인되었습니다.

또한 인덱스와 컬럼이 합집합으로 정렬된다는 점, dtype 변환 가능성, 대규모 데이터에서의 성능 고려사항 등도 주의해야 할 부분입니다.
실무 예제로는 고객 마스터 보강, 월별 통계 보정, 로그 데이터와 기준값 결합 사례를 통해 실제 활용법을 확인했습니다.
이러한 패턴을 익혀 두면 데이터 품질을 높이는 데 큰 도움이 됩니다.

즉, combine_first는 단순한 결측치 처리 함수를 넘어, 두 데이터셋을 효율적으로 결합하여 신뢰할 수 있는 분석 기반을 마련하는 데 유용한 도구입니다.
안정적인 전처리 전략을 세우고 싶은 데이터 분석가라면 반드시 알아두어야 할 기능이라 할 수 있습니다.


🏷️ 관련 태그 : pandas, 결측치처리, combine_first, 데이터분석, 파이썬프로그래밍, 데이터정제, 좌측우선병합, fillna차이, 데이터전처리, 파이썬실무