方法='linear'和'nearest'的Pandas.DataFrame interpolate()对于尾随NaN返回不一致的结果

时间:2019-02-20 17:32:47

标签: python pandas interpolation

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

例如:

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

除非您指定linear,否则fill_value = 'extrapolate'方法似乎将对末尾的NaN进行外推,而“ nearest”方法则不会:

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

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

在两个版本的熊猫“ 0.16.2”和“ 0.20.3”中也发现了相同的结果。

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

threadgithub issue在谈论类似的问题,但目的不同。我正在寻找对此问题的解释或结论。

编辑:

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

2 个答案:

答案 0 :(得分:0)

@ D.Weis,这是一个很好的问题,让我深入解释,没有线程和github问题。让我逐步解释。

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

1。)“线性”插值

在“线性”插补中,缺失值由两个最近的位置值填充。在“最近”插值中,它将用最接近的周围值填充缺失值,但是,在“最近”插值中,缺失值将与附近位置值具有相同的值。我已经在第(2)节中更深入地解释了“最近”插值。

用于“线性”插值的Emaple:

    1   1.0    1. 1.0 
    2   NaN    2. 2.0
    3   3.0    3. 3.0
    4   NaN    4. 4.0

在这里,第二个位置是空的。因此,要填充它的值,它将采用位置1st和3rd的值,分别是1.0和3.0。再次记住,在“线性”插值中,仅需2个周围值即可将其填充为缺失值。

(1.0+3.0/2) =2.0 = Answer for  2nd position. Similarly it will be for other values.

2。)通过“最近”插值

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

基本上,在“最近”插值中,它用最接近值中的相同值来填充缺失值。例如,

1   1.0    1. 1.0 
2   NaN    2. 1.0
3   3.0    3. 3.0
4   NaN    4. 3.0

因此,在上面的示例中,您可以轻松地看到位置2nd与位置1st具有相同的价值,因为它是与位置1最接近的值。简而言之,请紧记在“最近”插值中,借助最接近的周围值,缺失值将由相同值填充。

在method ='nearest',fill_value ='extrapolate'中,您可以在示例中看到,它将使用与第5个位置相同的值填充最后一个值。如上所述,该概念与填充缺失值相同。

注意: 此外,还有其他插值方法,例如“双线性”,“双三次”等。所有这些都与填充缺失值的准确性有关。

我的建议是,是否要从“最近”和“线性”插值中进行选择。我会说使用“线性”插值法,因为它比“最近”插值法更准确地填充值。

希望这会对您有所帮助。祝你好运!

答案 1 :(得分:0)

默认情况下,df.interpolate(method='linear')在最后一个有效值之后向前填充NaN。考虑到方法名称仅提及“内插”,这真令人惊讶。

要限制df.interpolate仅在有效(非NaN)值之间插值NaN, 从Pandas 0.23.0 (Reference)版开始,使用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)

收益

   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