python - 带有 method='linear' 和 'nearest' 的 Pandas.DataFrame interpolate() 为尾随 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 时表现不同?这是它应该是什么还是一个错误?
使用两个版本的熊猫“0.16.2”和“0.20.3”发现了相同的结果。
pandas.Series.interpolate()
也显示了同样的问题。
有一个线程 和一个github 问题谈论类似的问题,但目的不同。我正在寻找这个问题的解释或结论。
编辑:
更正:linear
方法的行为方式不完全正确extrapolation
,您可以看到最后一行的填充值是 5 而不是 6。现在看起来更像是一个错误,是吗?
解决方案
@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'
您的示例中可以看到,它将用第五个位置的相同值填充最后一个值。如上所述,该概念与填充缺失值的概念相同。
注意:此外,还有其他插值方法,例如“双线性”、“双三次”等。这都是关于填充缺失值的准确性。
我的建议是,如果您想从“最近”和“线性”插值中进行选择。我会说使用“线性”插值,因为它会比“最近”插值更准确地填充值。
希望这会对您有所帮助。祝你好运!
推荐阅读
- python - 性能不佳的迁移学习 ResNet50
- python-3.x - 二叉树搜索检查
- soapui - 如何在 SOAP UI 中将属性从一个测试用例转移到另一个
- amazon-web-services - 使用 CDK 部署时,Lambda 无法从外部文件夹中找到模块
- database - 如何更改当前数据库目录?
- python - Pandas 遍历两个数据帧
- python - 如何在带有熊猫的csv中为逗号分隔值提供一个新列?
- mysql - 如何计算api服务的数据并以角度组件显示在卡片中
- node.js - 验证仅适用于 post 方法
- asp.net-core - 我如何从身份服务器获取特定用户 - aspNetUsers 表依赖于他的 id