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