본문으로 건너뛰기
김신건의 로그

[Pandas] interpolate

· 수정 · 📖 약 1분 · 328자/단어 #python #pandas #null #missing-data #interpolation
Pandas interpolate, 결측치 보간, Series interpolate

정의

interpolate() 는 NaN 을 주변 값을 사용해 보간 으로 채운다. 시계열, 측정 데이터의 작은 결측을 자연스럽게 채울 때 유용.

기본

s.interpolate()                       # 기본 linear
s.interpolate(method='polynomial', order=2)
s.interpolate(method='time')          # index 가 DatetimeIndex 일 때
s.interpolate(method='spline', order=3)

linear 보간 예

python
import pandas as pd
import numpy as np
s = pd.Series([1, np.nan, np.nan, 4, np.nan, 6])
print('original    :', s.tolist())
print('interpolate :', s.interpolate().tolist())
결과
original    : [1.0, nan, nan, 4.0, nan, 6.0]
interpolate : [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
indexoriginalinterpolate
01.01.0
1NaN2.0
2NaN3.0
34.04.0
4NaN5.0
56.06.0

1 → 4 사이의 NaN 2 개를 직선 보간으로 2, 3 으로 채움.

다양한 method

method설명
linear (기본)직선 보간
time시간 간격 가중 (DatetimeIndex 필요)
indexindex 값을 X축으로
nearest가장 가까운 값
polynomial다항식 (order 필요)
spline스플라인 (order 필요, scipy 의존)
pchip, akima비단조 스플라인
from_derivatives기울기 기반

time-based 보간

ts = pd.Series([1, np.nan, np.nan, 10],
    index=pd.date_range('2024-01-01', periods=4, freq='D'))
ts.interpolate()                # 균등 간격 가정 → [1, 4, 7, 10]
ts.interpolate(method='time')    # 같은 결과 (간격이 균일하므로)

# 불균등 시계열
ts2 = pd.Series([1, np.nan, 10],
    index=pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-10']))
ts2.interpolate()                # 균등 가정 → [1, 5.5, 10]
ts2.interpolate(method='time')    # 시간 거리 가중 → [1, 2.0, 10]

time method 가 실제 거리 기반이라 더 자연스럽다.

양 끝의 NaN

s = pd.Series([np.nan, np.nan, 1, 2, np.nan, np.nan])
s.interpolate()
# [NaN, NaN, 1.0, 2.0, NaN, NaN]  ← 양 끝은 못 채움
s.interpolate(limit_direction='both')
# [1.0, 1.0, 1.0, 2.0, 2.0, 2.0]

limit_direction='backward' / 'forward' / 'both' 로 한 방향 채우기 가능.

limit (연속 NaN 개수 제한)

s.interpolate(limit=2)
# 연속 NaN 2 개까지만 채움, 그 이상은 NaN 유지

사용 시 주의

1. 잘못된 method 선택

  • outlier 가 많은 경우: linear 가 outlier 사이로 보간해 이상해질 수 있음
  • 시계열: time method 가 더 자연스러움 (불규칙 간격)
  • 곡선 트렌드: spline 또는 polynomial

2. interpolate 가 만능은 아님

# 연속 NaN 이 너무 많을 때
[1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 10]
# linear 보간하면 너무 큰 가정

데이터 특성에 따라 보간 자체가 부적절할 수 있음.

3. method=‘time’ 인데 datetime index 아님 → 오류

s.interpolate(method='time')   # TypeError if not DatetimeIndex

참고

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기