【问题标题】:interpolation on pandas dataframe columns熊猫数据框列的插值
【发布时间】:2020-03-17 13:46:34
【问题描述】:

我需要在pandas.DataFrame 的两列之间进行插值,以填充它们之间的列。 下面是我的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)

然后用y 填充col2 的第一行。我需要为每一行一次又一次地这样做。 怎么样?

【问题讨论】:

  • 两个值之间的线性插值只是平均值......或者我错过了什么?
  • 在这个例子中是平均值,但后来我需要用第 7 列和第 10 列填充第 8,9 列,所以我确实需要使用插值。
  • xp=[1,3] - 1 和 3 来自哪里?
  • 1 是 col1,3 是 col3
  • @SharonAsayag 我在下面更新了我的答案。不过,您可以自己进行线性插值,而无需多次调用 numpy.interp,这应该很慢。

标签: python pandas numpy dataframe interpolation


【解决方案1】:

这将使您遍历每一行,替换两个单元格之间的值。但是插值似乎不起作用。我没有太多经验,所以我在网上找不到简单的解决方法。这是唯一没有改变价值观的路线。 (我不知道 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)

【讨论】:

  • 我只有整数...对于我得到的所有行 2。
  • 我试过 float(numpy.interp(x, xp, fp)) 并没有帮助。有什么想法吗?
  • 是的,它只输出整数。只需阅读 cmets 和其他回复,我认为这与插值有关。我不知道它是如何工作的,但是如果您使用“xp=[1,3]”,那只是一个包含两个整数的列表,您可以将它们作为 x 坐标输入。而在我的示例中,fp,-y 坐标是 [2.35, 2.37]。一个不像另一个。如果在 xp=2.35 和 fp=2.37 上使用 x=2 进行插值,则得到 2.37 作为中间值。这只是我所有的试验和错误,因为我不知道插值是什么,但我相当确定它不能按照你需要的方式工作,atm。
【解决方案2】:

正如所写,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 函数。不管怎样,你应该没事。

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 2019-01-25
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多