Pandas插值在最后一个数据点之后替换NaN,但不是在第一个数据点之前

时间:2015-07-10 05:17:48

标签: python pandas interpolation

当使用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中的所有内容,但这是一个不同的问题。如果你回答它也会获得奖励!)

2 个答案:

答案 0 :(得分:9)

在内部,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_direction' '两个':

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

答案 1 :(得分:3)

pandas中的这种<tbody>行为看起来很奇怪。您可以使用interpolate来生成预期结果。对于线性外推,可以编写一个简单的函数来完成这项任务。

scipy.interpolate.interp1d