【问题标题】:Two Pandas dataframes, how to interpolate row-wise using scipy两个 Pandas 数据帧,如何使用 scipy 逐行插入
【发布时间】:2022-01-13 19:05:51
【问题描述】:

如何在两个数据帧上使用 scipy interpolate 来插入行上升?

例如,如果我有:

dfx = pd.DataFrame({"a": [0.1, 0.2, 0.5, 0.6], "b": [3.2, 4.1, 1.1, 2.8]})
dfy = pd.DataFrame({"a": [0.8, 0.2, 1.1, 0.1], "b": [0.5, 1.3, 1.3, 2.8]})
display(dfx)
display(dfy)

假设我想对 y(x=0.5) 进行插值,我怎样才能将结果放入一个可以放入新数据帧的数组中?

预期结果是:[0.761290323 0.284615385 1.1 -0.022727273]

例如,对于第一行,您可以看到预期值为 0.761290323:

x = [0.1, 3.2] # from dfx, row 0
y = [0.8,0.5] # from dfy, row 0
fig, ax = plt.subplots(1,1)
ax.plot(x,y)

f = scipy.interpolate.interp1d(x,y)
out = f(0.5)
print(out)

我尝试了以下但收到ValueError: x and y arrays must be equal in length along interpolation axis.

f = scipy.interpolate.interp1d(dfx, dfy)
out = np.exp(f(0.5))
print(out)

【问题讨论】:

  • 逐行插值是什么意思? x 这里是什么?
  • @QuangHoang OP 更新

标签: pandas scipy interpolation


【解决方案1】:

由于您正在寻找线性插值,您可以这样做:

def interpolate(val, dfx, dfy):
    t = (dfx['b'] - val) / (dfx['b'] - dfx['a'])
    return dfy['a'] * t + dfy['b'] * (1-t)

interpolate(0.5, dfx, dfy)

输出:

0    0.885714
1    0.284615
2    1.100000
3   -0.022727
dtype: float64

【讨论】:

  • 为了简单起见我使用了线性插值,我将在现实中使用样条,这就是我指定 scipy 模块的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2017-01-20
  • 2021-11-29
  • 2015-11-06
  • 2020-08-21
  • 1970-01-01
  • 2018-05-15
相关资源
最近更新 更多