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

标签 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 处的值保留原样?

我可以改变这种行为吗?我想在索引 5 和 6 处保留 NaN。

(实际上,我希望它进行线性外推以填充所有 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

关于python - Pandas 插值在最后一个数据点之后替换 NaN,但不在第一个数据点之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31332981/

相关文章:

python - 哪个 python 模块包含文件对象方法?

python - 使用 Pygame 在 Python 游戏中随机显示图像

python - 为什么比较两个数据帧时会得到不同的结果?

python - 如何为 "scipy.interpolate.make_lsq_spline"选择好的结序列

python - 三次样条 Python 代码生成线性样条

python - numpy中导数的三次插值

Python 抽象基类 : Why doesn't abc prevent instantiation?

python - 将列表中的整数排序到 bin 中

pandas - 发生转变 : using pandas shift to combine rows

python-3.x - 我无法按列值过滤数据框