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 日之間位於三分之一處,因此內插值也會位於 10 至 30 的三分之一處,結果為 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。