Pandas.DataFrame 使用method='linear'进行插值(),'nearest'返回尾随NaN的不一致结果



我正在用不同的方法探索 pandas.DataFrame.interpolate()linear vs. 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方法似乎会推断尾随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

所以我的问题是,这两种方法在处理尾随NAN方面的行为有所不同?它应该是什么还是一个错误?

发现了两个版本的Pandas," 0.16.2"one_answers" 0.20.3"。

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

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

编辑:

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

@d。让我逐步解释。

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

在这里,第二位置为空。因此,要填写值,它将分别为1和3的位置值,分别为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

因此,在上面的示例中,您可以轻松地看到位置第二位于位置第一的Valeus,因为它是与第一位置的最接近值。在简而

method='nearest', fill_value='extrapolate'中,您可以在示例中看到它会以相同的第五位置值填充最后一个值。该概念与填充上述所述的缺失值保持不变。

注意:此外,还有其他插值方法,例如"双线性","双色"等。填充缺失值的准确性。

我的建议是,如果您想从"最近"one_answers"线性"插值中进行选择。我想说的是"线性"插值,因为它比"最近的"插值更准确地填充值。

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

默认情况下,在最后一个有效值之后, df.interpolate(method='linear')向前填充nans。鉴于该方法名称仅提及"插值"。

,这很令人惊讶。

限制 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)

产生

   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

最新更新