当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。