找到 y 值的线性插值

Linear interpolation to find y values

我有一个数据框:

1  Amazon        1      x  0.0     1.0     2.0    3.0    4.0
2  Amazon        1      y  0.0     0.4     0.8    1.2    1.6
4  Amazon        2      x  0.0     2.0     4.0    6.0    8.0
5  Amazon        2      y  0.0     1.0     2.0    3.0    4.0

df2:

 Amazon   1       1
 Amazon   2       2.3
 Netflix  1       4.1
 Netflix  2       5.5

鉴于这两个数据帧,我正在尝试使用线性插值找到 df2 的 'y values',使用 df1 断点

预期输出:

   Amazon   1       1    ...
   Amazon   2       2.3  ...

线性插值的公式为:y = y1 + ((x – x1) / (x2 – x1)) * (y2 – y1),其中x为已知值,y为未知值,x1和y1是低于已知x值的坐标,x2和y2是高于x值的坐标。

df 的格式看起来很奇怪(数据点在列中,而不是行中)。

下面根本不是最干净的解决方案:

import numpy as np

lookup_df = df1.set_index(["Name", "Segment", "Axis"]).T

def find_interp(row):
    try:
        res = np.interp([row["x"]], lookup_df[(row["Name"], row["Segment"], "x")], lookup_df[(row["Name"], row["Segment"], "y")])
    except:
        res = [np.nan]
    return res[0]


>>> df2["y"] = df2.apply(find_interp, axis=1)
>>> df2
      Name  Segment    x     y
0   Amazon        1  1.0  0.40
1   Amazon        2  2.3  1.15
2  Netflix        1  4.1   NaN
3  Netflix        2  5.5   NaN