在最后一个数据点之后,而不是在第一个数据点之前,用PANAS插值法替换NAN
问题描述
使用 pandas Interpolate()填充NaN值时,如下所示:
In [1]: s = pandas.Series([np.nan, np.nan, 1, np.nan, 3, np.nan, np.nan])
In [2]: s.interpolate()
Out[2]:
0 NaN
1 NaN
2 1
3 2
4 3
5 3
6 3
dtype: float64
In [3]: pandas.version.version
Out[3]: '0.16.2'
,为什么 pandas 将索引5和6的值替换为3,而将索引0和1的值保持不变?
我可以更改此行为吗?我想将NaN留在索引5和6处。
(实际上,我希望它线性外推以填充所有的0、1、5和6,但这是另一个问题。如果你也回答的话会加分!)
限制
在内部,interpolate方法使用‘推荐答案’参数,避免填充传播超过特定阈值。
>>>df=pd.DataFrame( [0, np.nan, np.nan, np.nan, np.nan,np.nan, 2] )
>>>df
df
0
0 0
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
6 2
>>>df.interpolate(limit=2)
0
0 0.000000
1 0.333333
2 0.666667
3 NaN
4 NaN
5 NaN
6 2.000000
默认情况下,该限制应用于正向。在反向,有一个设置为零的默认限制。这就是为什么您的第一步不是由方法填充的。 用户可以使用‘Limit_Direction’参数更改方向。
df.interpolate(limit=2, limit_direction='backward')
0
0 0.000000
1 NaN
2 NaN
3 NaN
4 1.333333
5 1.666667
6 2.000000
要填充数据帧的第一步和最后一步,您可以将‘Limit’和‘Limit_Direction’的非零值设置为‘Both’:
>>> df=pd.DataFrame( [ np.nan, np.nan, 0, np.nan, 2, np.nan,8,5,np.nan, np.nan] )
>>> df
0
0 NaN
1 NaN
2 0
3 NaN
4 2
5 NaN
6 8
7 5
8 NaN
9 NaN
>>> df.interpolate(method='spline', order=1, limit=10, limit_direction='both')
0
0 -3.807382
1 -2.083581
2 0.000000
3 1.364022
4 2.000000
5 4.811625
6 8.000000
7 5.000000
8 4.937632
9 4.138735
该主题已讨论here
相关文章