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。