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