method='index' 时的 Pandas 插值类型?

问题描述

pandas documentation 表示当 method='index' 时,使用索引的数值。但是,我没有发现任何关于所采用的基本插值方法的迹象。看起来它使用线性插值。任何人都可以明确地确认这一点或指出我在文档中说明的位置吗?

解决方法

因此,对于那些阅读它的人可能会认为:

‘index’,‘values’:使用索引的实际数值。

由于用索引的数值填充NaN值是不正确的,我们应该将其理解为使用索引实际数值的线性插值

source code of pandas.DataFrame.interpolatemethod='linear'method='index' 的区别主要在于以下代码:

if method == "linear":
# prior default
    index = np.arange(len(obj.index))
    index = Index(index)
else:
    index = obj.index

因此,如果您使用默认的 RangeIndex 作为数据框的索引,则 method='linear'method='index' 的插值结果将相同,但是如果您指定不同的索引,则结果将不一样,下面的例子会清楚地告诉你区别:

import pandas as pd
import numpy as np

d = {'val': [1,np.nan,3]}
df0 = pd.DataFrame(d)
df1 = pd.DataFrame(d,[0,1,6])

print("df0:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df0.interpolate(method='index'),df0.interpolate(method='linear')))
print("df1:\nmethod_index:\n{}\nmethod_linear:\n{}\n".format(df1.interpolate(method='index'),df1.interpolate(method='linear')))

输出:

df0:
method_index:
   val
0  1.0
1  2.0
2  3.0
method_linear:
   val
0  1.0
1  2.0
2  3.0

df1:
method_index:
   val
1  1.000000
2  1.333333
6  3.000000
method_linear:
   val
1  1.0
2  2.0
6  3.0

如您所见,当 index=[0,6]val=[1.0,2.0,3.0] 时,插值是 1.0 + (3.0-1.0) / (6-0) = 1.333333

按照pandas源代码的运行时间(generic.py -> managers.py -> blocks.py -> missing.py),我们可以找到linear的实现interpolate value 使用索引的实际数值

NP_METHODS = ["linear","time","index","values"]

if method in NP_METHODS:
    # np.interp requires sorted X values,#21037
    indexer = np.argsort(inds[valid])
    result[invalid] = np.interp(
        inds[invalid],inds[valid][indexer],yvalues[valid][indexer]
    )