데이터 분석을 하다 보면 pandas나 geopandas에서 merge()를 사용할 일이 많습니다. 특히 공간 데이터를 다루는 과정에서는 두 데이터프레임을 병합해야 하는 경우가 흔한데요. 오늘은 GeoPandas 병합 시 값이 안 붙는 문제에 대해 원인과 해결책을 정리해봅니다.
🔍 문제 상황
다음과 같은 코드를 실행했을 때, 병합이 전혀 되지 않는 경우를 겪은 적 있으신가요?
격자_생활인구_merged = 격자_50by50.merge(집계구_생활인구수, left_on="grid_to_jgg_cd", right_on="TOT_REG_CD", how='left')
하지만 merge 결과를 확인해보면 _merge 컬럼이 다음과 같이 나옵니다:
left_only 244416
right_only 0
both 0
즉, 모든 행이 병합 실패 (left_only) 상태인 것이죠. 분명히 grid_to_jgg_cd와 TOT_REG_CD에는 공통된 값이 있다고 생각했는데 왜 안 붙는 걸까요?
🧠 주요 원인 3가지
✅ 1. 데이터 타입 불일치
가장 흔한 원인입니다. 아래처럼 한쪽은 int, 한쪽은 str이면 병합이 되지 않습니다.
print(격자_50by50['grid_to_jgg_cd'].dtype) # 예: int64
print(집계구_생활인구수['TOT_REG_CD'].dtype) # 예: object (str)
해결 방법:
# 문자열로 변환 후 병합
격자_50by50['grid_to_jgg_cd'] = 격자_50by50['grid_to_jgg_cd'].astype(str)
집계구_생활인구수['TOT_REG_CD'] = 집계구_생활인구수['TOT_REG_CD'].astype(str)
✅ 2. 공백/개행문자 포함
눈에 보이지 않는 공백 문자(예: '1101053010006 ' vs '1101053010006')가 포함되어 있으면 병합이 되지 않습니다.
해결 방법:
격자_50by50['grid_to_jgg_cd'] = 격자_50by50['grid_to_jgg_cd'].str.strip()
집계구_생활인구수['TOT_REG_CD'] = 집계구_생활인구수['TOT_REG_CD'].str.strip()
✅ 3. 포맷 또는 자리수 불일치
ID 값이 13자리 vs 15자리처럼 보이지만 실제 값의 길이가 다른 경우도 있습니다.
해결 방법:
격자_50by50['grid_to_jgg_cd'].astype(str).str.len().value_counts()
집계구_생활인구수['TOT_REG_CD'].astype(str).str.len().value_counts()
→ 길이를 확인하고 포맷을 맞춰야 합니다. 예를 들어, zfill()로 앞에 0을 채워 맞출 수도 있습니다.
격자_50by50['grid_to_jgg_cd'] = 격자_50by50['grid_to_jgg_cd'].str.zfill(15)
✅ 병합 성공 여부 확인하는 팁
아래처럼 _merge 컬럼을 추가해서 병합 성공 여부를 확인할 수 있습니다.
df_check = 격자_50by50.merge(
집계구_생활인구수,
left_on="grid_to_jgg_cd",
right_on="TOT_REG_CD",
how='left',
indicator=True
)
print(df_check['_merge'].value_counts())
🔧 병합 전 공통값 미리 확인하는 방법
common_keys = set(격자_50by50['grid_to_jgg_cd']) & set(집계구_생활인구수['TOT_REG_CD'])
print("공통된 값 개수:", len(common_keys))
print("예시:", list(common_keys)[:5])
✨ 마무리
GeoPandas나 Pandas에서 merge()를 썼는데 값이 안 붙는다면,
- 데이터 타입을 맞추고,
- 공백 및 포맷을 정리하고,
- 공통값이 존재하는지를 확인해보세요.
단순한 문제처럼 보여도 실제 분석 시간의 80%는 이런 전처리에서 걸리기도 하죠.
저처럼 고생하지 마시고, 위 방법으로 빠르게 해결하시길 바랍니다!
댓글