Pandas.DataFrame interpolate() 方法='线性'和'最近'返回尾随 NaN 不一致的结果

Lev*_*evi 5 python interpolation pandas

我正在探索pandas.DataFrame.interpolate()不同的方法,linearnearest,并且当尾部缺少数据时,我发现这两种方法的输出不同。

例如:

import pandas as pd # version: '0.16.2' or '0.20.3'
>>> a = pd.DataFrame({'col1': [np.nan, 1, np.nan, 3, np.nan, 5, np.nan]})
Out[1]: 
   col1
0   NaN
1   1.0
2   NaN
3   3.0
4   NaN
5   5.0
6   NaN

>>> a.interpolate(method='linear')
Out[2]: 
   col1
0   NaN
1   1.0
2   2.0
3   3.0
4   4.0
5   5.0
6   5.0

>>> a.interpolate(method='nearest')
Out[3]: 
   col1
0   NaN
1   1.0
2   1.0
3   3.0
4   3.0
5   5.0
6   NaN

Run Code Online (Sandbox Code Playgroud)

看来该linear方法将对尾随 NaN 进行外推,而“最近”方法则不会,除非您指定fill_value = 'extrapolate'

>>> a.interpolate(method='nearest', fill_value='extrapolate')
Out[4]: 
   col1
0   NaN
1   1.0
2   1.0
3   3.0
4   3.0
5   5.0
6   5.0
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么这两种方法在处理尾随 NaN 时表现不同?这是它应该的样子还是一个错误?

两个版本的 pandas“0.16.2”和“0.20.3”也发现了相同的结果。

pandas.Series.interpolate()也显示了同样的问题。

有一个线程 和一个github 问题讨论了类似的问题,但目的不同。我正在寻找这个问题的解释或结论。

编辑:

更正:该linear方法的行为方式并不完全正确extrapolation,因为您可以看到最后一行的填充值为 5 而不是 6。现在看起来更像是一个错误,不是吗?

unu*_*tbu 0

默认情况下,df.interpolate(method='linear')在最后一个有效值之后前向填充 NaN。鉴于方法名称只提到“插值”,这是相当令人惊讶的。

要限制df.interpolate为仅在有效(非 NaN)值之间插入 NaN,从 Pandas 版本 0.23.0 (参考)开始,请使用limit_area='inside'

import pandas as pd
import numpy as np
a = pd.DataFrame({'col1': [np.nan, 1, np.nan, 3, np.nan, 5, np.nan]})
a['linear'] = a.interpolate(method='linear')['col1']
a['linear inside'] = a.interpolate(method='linear', limit_area='inside')['col1']
print(a)
Run Code Online (Sandbox Code Playgroud)

产量

   col1  linear  linear inside
0   NaN     NaN            NaN
1   1.0     1.0            1.0
2   NaN     2.0            2.0
3   3.0     3.0            3.0
4   NaN     4.0            4.0
5   5.0     5.0            5.0
6   NaN     5.0            NaN
Run Code Online (Sandbox Code Playgroud)