API · Pandas
Pandas DataFrame DataFrame.interpolate() 함수
DataFrame interpolate() 함수는 보간 기법을 사용하여 DataFrame의 NaN 값을 채 웁니다.
이 페이지의 내용
Python Pandas의 DataFrame.interpolate()은 선택한 축을 따라 주변 값으로 결측값을 추정합니다. 사용 가능한 값이 양쪽에 있으면 내부의 빈 구간을 채울 수 있지만, 데이터에 충분한 정보가 없으면 일부 값은 계속 결측 상태로 남을 수 있습니다. (NaN)
pandas.DataFrame.interpolate()의 구문과 매개변수
메서드는 일반적으로 다음 형식으로 호출합니다.
DataFrame.interpolate(method="linear", axis=0, limit=None, inplace=False, limit_direction="forward", limit_area=None, **kwargs)
예제에서는 작은 숫자형 DataFrame을 사용하므로 입력값을 자신의 데이터에 맞게 바꿔 적용할 수 있습니다.
| 매개변수 | 제어하는 내용 |
|---|---|
method |
보간 방식입니다. 이 문서에서는 기본값인 linear와 time을 다룹니다. 설치된 버전에서 지원하는 옵션은 pandas API 문서를 확인하세요. |
axis |
보간 방향입니다. 0은 각 열에서 행을 따라 아래로 보간하고, 1은 각 행에서 열을 따라 보간합니다. |
limit |
한 구간에서 연속된 결측값 중 채울 최대 개수입니다. |
limit_direction |
limit을 지정했을 때 결측 구간의 시작 부분("forward"), 끝 부분("backward") 또는 양쪽 끝("both")부터 채울지 선택합니다. |
inplace |
True이면 원래 DataFrame을 수정합니다. 기본값은 False입니다. |
limit_area |
limit을 지정했을 때 값을 채울 위치를 제한하는 선택적 설정입니다. 여기서는 예제로 다루지 않습니다. |
**kwargs |
선택한 보간 방식이 허용하는 추가 키워드 인수입니다. 의미는 해당 방식에 따라 달라집니다. |
기본 방식으로 결측값 보간하기
기본값인 method="linear"를 사용하면 pandas는 선택한 축의 위치가 균등한 간격이라고 보고 값을 추정합니다. 이 예제에서는 10과 30 사이의 결측값을 20으로 추정하고, 마지막 결측값은 마지막으로 알려진 값인 30.0을 이어 받아 채웁니다.
다음 예제를 실행해 보세요.
import pandas as pd
df = pd.DataFrame({"temperature": [10.0, None, 30.0, None]})
result = df.interpolate()
print(result)
temperature
0 10.0
1 20.0
2 30.0
3 30.0
주변 관측값을 바탕으로 결측값을 추정해야 할 때는 보간을 사용하세요. 반면 pandas.DataFrame.fillna()는 지정한 값이나 다른 채우기 방식으로 결측값을 대체합니다. 어느 방법이 적합한지는 데이터와 작업 목적에 따라 다릅니다.
보간 방식 선택하기
행 위치가 균등한 간격인 일반적인 숫자 측정값에는 기본 method를 그대로 사용하면 됩니다. 시간 인덱스가 있는 DataFrame에서 method="time"을 지정하면 인덱스에 반영된 시간 간격을 기준으로 값을 추정합니다. 관측 시점의 간격이 일정하지 않을 때 유용합니다. 아래 시간 기반 예제에서 필요한 인덱스 형태를 확인할 수 있습니다.
사용 가능한 방식과 각 방식의 요구 사항은 pandas 버전에 따라 다를 수 있습니다. 다른 방식을 선택하거나 해당 방식 전용 키워드 인수를 전달하기 전에 사용 중인 버전의 API 문서를 확인하세요.
보간 축 선택하기
기본값인 axis=0은 각 열을 따라 아래 방향으로 값을 채웁니다. axis=1로 설정하면 각 행에서 열을 따라 값을 채웁니다. 예를 들어 axis=1에서는 한 행의 10과 30 사이에 있는 결측값을 20으로 추정합니다. 행에 알려진 값이 하나도 없다면 추정에 사용할 값이 없으므로 해당 행의 결측값은 그대로 남습니다.
import pandas as pd
df = pd.DataFrame(
{"morning": [10.0, None], "afternoon": [None, None], "evening": [30.0, None]},
dtype="float64",
)
print(df.interpolate(axis=1))
morning afternoon evening
0 10.0 20.0 30.0
1 NaN NaN NaN
명시적으로 숫자형 dtype을 지정하면 모든 값이 결측인 열도 숫자형으로 유지되므로 행을 따라 보간할 수 있습니다. 이 axis=1 예제에서는 열 이름이 아니라 열의 위치를 기준으로 선형 간격을 계산합니다.
연속 결측값 개수와 채우기 방향 제한하기
limit을 설정하면 pandas가 각 결측 구간에서 채울 연속 결측값의 최대 개수를 제한할 수 있습니다. limit_direction은 그 제한을 적용할 방향을 결정합니다. 0과 40 사이에 결측값이 세 개 있는 경우, limit=1과 순방향 채우기를 함께 사용하면 위쪽에서 첫 번째 결측 위치를 채우고, 역방향 채우기를 사용하면 아래쪽에서 마지막 결측 위치를 채웁니다. 나머지 결측값은 그대로 남습니다.
import pandas as pd
df = pd.DataFrame({"reading": [0.0, None, None, None, 40.0]})
print("Forward:")
print(df.interpolate(limit=1, limit_direction="forward"))
print("Backward:")
print(df.interpolate(limit=1, limit_direction="backward"))
Forward:
reading
0 0.0
1 10.0
2 NaN
3 NaN
4 40.0
Backward:
reading
0 0.0
1 NaN
2 NaN
3 30.0
4 40.0
양쪽 끝에서 채우는 것이 적절하다면 limit_direction="both"를 사용하세요. 결측 구간이 제한값보다 길 때는 결과 데이터를 확인해야 합니다.
시간 인덱스가 있는 데이터 보간하기
시간 보간에는 날짜와 경과 시간이 일반 열의 문자열이 아니라 인덱스 값으로 들어 있는 DatetimeIndex를 사용하세요. 1월 2일은 1월 1일부터 1월 4일까지의 시간 중 3분의 1 지점입니다. 따라서 보간값도 10과 30 사이의 3분의 1 지점인 16.666667입니다.
import pandas as pd
index = pd.to_datetime(["2024-01-01", "2024-01-02", "2024-01-04"])
df = pd.DataFrame({"value": [10.0, None, 30.0]}, index=index)
print(df.interpolate(method="time"))
value
2024-01-01 10.000000
2024-01-02 16.666667
2024-01-04 30.000000
시간 보간을 사용할 때는 날짜와 시간으로 구성된 인덱스를 유지하세요. 날짜를 일반 텍스트 열로 바꾸면 메서드가 사용하는 시간 간격을 제공하지 못합니다.
반환값과 제자리 수정 동작
기본적으로 DataFrame.interpolate()은 보간 결과가 담긴 새 DataFrame을 반환하고 원래 객체는 변경하지 않습니다. inplace=True이면 원래 DataFrame을 수정한 뒤 None을 반환합니다. 따라서 기본 동작을 사용할 때만 반환 결과를 변수에 할당하세요.
import pandas as pd
df = pd.DataFrame({"reading": [1.0, None, 3.0]})
result = df.interpolate(inplace=True)
print(result)
print(df)
reading
0 1.0
1 2.0
2 3.0
reading
0 1.0
1 2.0
2 3.0
첫 번째로 출력되는 값은 None이고, 두 번째는 수정된 DataFrame입니다.