當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python Pandas DataFrame interpolate方法用法及代碼示例


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 | intstring | optional

是否對每行或列進行插值:

說明

0"index"

對每一列進行插值

1"columns"

對每一行進行插值

默認情況下,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 | Nonestring | 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

請注意,對於 forwardbackward ,當沒有上一個/下一個非 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

相關用法


注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas DataFrame | interpolate method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。