🖥️ IT, 컴퓨터/🐍 Python

[Python] GeoPandas merge가 안 붙을 때? 값이 병합되지 않는 이유와 해결 방법 정리

김 홍시 2025. 4. 18.
반응형

 


 

데이터 분석을 하다 보면 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()를 썼는데 값이 안 붙는다면,

  1. 데이터 타입을 맞추고,
  2. 공백 및 포맷을 정리하고,
  3. 공통값이 존재하는지를 확인해보세요.

단순한 문제처럼 보여도 실제 분석 시간의 80%는 이런 전처리에서 걸리기도 하죠.
저처럼 고생하지 마시고, 위 방법으로 빠르게 해결하시길 바랍니다!

 

반응형

댓글