Pandas DataFrame.interpolate(~)
方法使用插值填充 NaN
。
參數
1.method
| string
| linear
用於插值的算法:
-
"linear"
:簡單線性插值。 -
"time"
:使用 DatetimeIndex 進行插值。 -
"index"
或"values"
:使用索引進行插值。請參閱下麵的示例。 -
"pad"
:使用上一個或下一個非NaN
值來填充。可以使用limit_direction
設置方向。
此外,您還可以使用scipy.interpolate.interp1d
可用的插值方法:
nearest, zero, slinear, quadratic, cubic, spline, barycentric, polynomial
其中一些方法需要傳遞參數,您可以使用 **kwargs
來執行此操作,如下所示:
df.interpolate(method="polynomial", order=5)
2. axis
| int
或 string
| optional
是否對每行或列進行插值:
軸 |
說明 |
---|---|
|
對每一列進行插值 |
|
對每一行進行插值 |
默認情況下,axis=0
。
3. limit
| int
| optional
要填充的連續 NaN
的最大數量(含)。例如limit=3
,且有3
連續NaN
,則填充前兩個NaN
,第三個保持不變。
4. inplace
| boolean
| optional
-
如果是
True
,那麽該方法將直接修改源DataFrame,而不是創建新的DataFrame。 -
如果是
False
,則將創建並返回一個新的DataFrame。
默認情況下,inplace=False
。
5. limit_direction
| string
| optional
NaN
的填充方向:
-
"forward"
:使用之前的非NaN
值來填充 -
"backward"
:使用下一個非NaN
值來填充 -
"both"
:如果前一個非NaN
值不可用,則使用下一個非NaN
值來填充,反之亦然。
僅當指定 limit
時,這才相關。默認情況下,limit_direction="forward"
。
6. limit_area
| None
或 string
| optional
填寫限製:
-
None
:無限製。 -
"inside"
:僅執行插值(即當定義了間隔的下限和上限時) -
"outside"
:僅執行外推(即僅定義間隔的一個界限時)
默認情況下,limit_area=None
。
7. downcast
| "infer"
或 None
| optional
是否向下轉換生成的數據類型。默認情況下,downcast=None
。
8.**kwargs
要傳遞給 method
的關鍵字參數。
返回值
DataFrame 和 NaN
填充了插值。
例子
基本用法
考慮以下 DataFrame :
df = pd.DataFrame({"A":[3,np.nan,5,6],"B":[1,5,np.nan,9],"C":[1,5,np.nan,np.nan]})
df
A B C
0 3.0 1.0 1.0
1 NaN 5.0 5.0
2 5.0 NaN NaN
3 6.0 9.0 NaN
使用線性插值填充NaN
:
df.interpolate() # method="linear"
A B C
0 3.0 1.0 1.0
1 4.0 5.0 5.0
2 5.0 7.0 5.0
3 6.0 9.0 5.0
請注意 C
列中的兩個 NaN
是如何使用前向填充(默認)來填充的,因為沒有上限就無法執行線性插值。
逐行插值
要按行插值,請傳入 axis=1
,如下所示:
df.interpolate(axis=1)
A B C
0 3.0 1.0 1.0
1 NaN 5.0 5.0
2 5.0 5.0 5.0
3 6.0 9.0 9.0
使用 method=index 進行插值
考慮以下DataFrame
df = pd.DataFrame({"B":[5,np.nan,9]}, index=[5,10,30])
df
B
5 5.0
10 NaN
30 9.0
執行簡單的線性插值產生:
df.interpolate() # method="linear"
B
5 5.0
10 7.0
30 9.0
在這裏,我們得到 7
作為插值,因為下限和上限 ( 4
) 之間的差異被分為 2 個 equally-distanced 間隔。
相反,使用 method="index"
進行插值會得到:
df.interpolate(method="index")
B
5 5.0
10 5.8
30 9.0
這裏,下限和上限之間的差(4
) 不是除以間隔數,而是除以指標值的差異(30-5=25
)。所以,我們最終得到5.8
因為:
(4/25 * 5) + 5 = 5.8
使用 method=time 進行插值
考慮以下帶有 DatetimeIndex
的 DataFrame :
index_date = pd.to_datetime(["2020-12-01", "2020-12-02", "2020-12-15", "2020-12-31"])
df = pd.DataFrame({"A":[1,np.nan,np.nan,31]}, index=index_date)
df
A
2020-12-01 1.0
2020-12-02 NaN
2020-12-15 NaN
2020-12-31 31.0
如果我們對 df
執行線性插值:
df.interpolate()
A
2020-12-01 1.0
2020-12-02 11.0
2020-12-15 21.0
2020-12-31 31.0
這裏,不考慮索引 - 下限是 1
,上限是 31
,並且差值均勻分布在 3 個間隔中。
要考慮 DatatimeIndex
,請傳入 method="time"
:
df.interpolate(method="time")
A
2020-12-01 1.0
2020-12-02 2.0
2020-12-15 15.0
2020-12-31 31.0
在這裏,界限仍然相同 - 下限是 1
,上限是 31
。我們不是將差值 30 除以間隔數,而是將差值除以時間長度,在本例中為 30 天。這就是為什麽,例如,對於第 15 天,我們會看到 15 的插值。
指定限製方向
考慮以下 DataFrame :
df = pd.DataFrame({"A":[np.nan,np.nan,5], "B":[5,np.nan,9], "C":[5,np.nan,np.nan]})
df
A B C
0 NaN 5.0 5.0
1 NaN NaN NaN
2 5.0 9.0 NaN
默認情況下, limit_direction="forward"
,這意味著我們使用之前的非 NaN
值來填充 NaN
:
df.interpolate() # limit_direction="forward"
A B C
0 NaN 5.0 5.0
1 NaN 7.0 5.0
2 5.0 9.0 5.0
要使用下一個非 NaN
值來填充 NaN
,請傳入 limit_direction="backward"
:
df.interpolate(limit_direction="backward")
A B C
0 5.0 5.0 5.0
1 5.0 7.0 NaN
2 5.0 9.0 NaN
請注意,對於 forward
和 backward
,當沒有上一個/下一個非 NaN
值時,我們仍然可能得到 NaN
值。我們可以通過設置 limit_direction="both"
來防止這種情況,這確保如果前一個非 NaN
值不可用,則將使用下一個非值,反之亦然:
df.interpolate(limit_direction="both")
A B C
0 5.0 5.0 5.0
1 5.0 7.0 5.0
2 5.0 9.0 5.0
向下轉換生成的DataFrame
默認情況下, downcast=None
,這意味著如果可以將列類型轉換為更具體的類型,則甚至不會執行轉換。
例如,考慮以下 DataFrame:
df = pd.DataFrame({"A":[np.nan,5], "B":[5,np.nan]})
df
A B
0 NaN 5.0
1 5.0 NaN
執行插值產生:
df.interpolate() # downcast=None
A B
0 NaN 5.0
1 5.0 5.0
檢查生成的 DataFrame 的列類型:
df.interpolate().dtypes
A float64
B float64
dtype: object
在這種情況下,可以使用更具體的類型,即 int
,作為 B
的列類型。要執行此向下轉換,請設置 downcast="infer"
:
df.interpolate(downcast="infer").dtypes
A float64
B int64
dtype: object
相關用法
- Python PySpark DataFrame intersect方法用法及代碼示例
- Python PySpark DataFrame intersectAll方法用法及代碼示例
- Python Pandas DataFrame insert方法用法及代碼示例
- Python Pandas DataFrame infer_objects方法用法及代碼示例
- Python Pandas DataFrame index屬性用法及代碼示例
- Python Pandas DataFrame info方法用法及代碼示例
- Python Pandas DataFrame items方法用法及代碼示例
- Python Pandas DataFrame isin方法用法及代碼示例
- Python Pandas DataFrame idxmin方法用法及代碼示例
- Python Pandas DataFrame iloc屬性用法及代碼示例
- Python Pandas DataFrame idxmax方法用法及代碼示例
- Python Pandas DataFrame iteritems方法用法及代碼示例
- Python Pandas DataFrame isna方法用法及代碼示例
- Python Pandas DataFrame iat屬性用法及代碼示例
- Python Pandas DataFrame itertuples方法用法及代碼示例
- Python Pandas DataFrame iterrows方法用法及代碼示例
- Python Pandas DataFrame isnull方法用法及代碼示例
- Python Pandas DataFrame empty屬性用法及代碼示例
- Python Pandas DataFrame pop方法用法及代碼示例
- Python Pandas DataFrame nsmallest方法用法及代碼示例
- Python Pandas DataFrame sample方法用法及代碼示例
- Python Pandas DataFrame max方法用法及代碼示例
- Python Pandas DataFrame swaplevel方法用法及代碼示例
- Python Pandas DataFrame agg方法用法及代碼示例
- Python Pandas DataFrame copy方法用法及代碼示例
注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas DataFrame | interpolate method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。