在熊猫数据框列上进行插值

时间:2020-03-17 13:46:34

标签: python pandas numpy dataframe interpolation

我需要在pandas.DataFrame的2列之间进行内插,以填充它们之间的列。 这是我的data frame的几行,要填充的列是col2

col1  col2  col3
2.35    1   2.37
2.47    1   2.49
2.51    1   2.53
2.57    1   2.58
2.54    1   2.57

因此对于插值,我想使用numpy.interp(x,xp,fp),但我不知道如何组织数据以便能够使用它。这是因为对于每一行,插值应该在col1col3之间。 例如,对于第一行,我需要它看起来像这样:

xp=[1,3]
fp=[2.47,2.49]
x=2
y=numpy.interp(x,xp,fp)

,然后用col2填充y的第一行。我需要为每一行一次又一次地执行此操作。 怎么样?

2 个答案:

答案 0 :(得分:0)

这将使您遍历每一行,替换两个单元格之间的值。但是插值似乎不起作用。我没有太多的经验,所以我找不到在线简单的修复程序。那是唯一不更改值的行。 (我不知道xp或x做什么,所以我保留了它们)

xp=[1,3]
x = 2
for rowNr in range(len(df.index)):
    fp=[df.iat[rowNr, 0], df.iat[rowNr, 2]]
    df.iat[rowNr, 1] = numpy.interp(x, xp, fp)

答案 1 :(得分:0)

按照书面规定,x值是静态的(除非我误解了您的问题),值为1和3。您希望在这些值和两个变化的y值之间进行线性插值。您只需将y值取平均值,即线性插值。不要忽略一些花哨的简单/明显的解决方案(建议我会一直记住)。

df.col2 = df[["col1", "col3"]].mean(axis=1)

开始编辑

安德烈(Andre)的解决方案应该可以工作(我自己没有测试过,但是应该可以)。但是,这需要遍历每行,这可能很慢。此外,还有一个简单的数学解决方案,它允许您对数组进行操作,该数组应该更快。

线性插值遵循以下一般形式:

y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)

根据数据帧/代码来放置它:

df.col2 = df.col1 + (x - xp[0]) * (df.col2 - df.col1) / (xp[1] - xp[0])

我认为翻译正确,但是上面的公式成立。只需在您的代码中实现它或遍历每一行并调用numpy.interp函数即可。无论哪种方式,您都应该没事。