Pandas根据不同列插值NaN值

13

我有以下DataFrame(提取)

data = pd.DataFrame([[0., -10.88948939, 74.22099994, 1.5, "NW", 0], [0.819377018, -10.88948939, 74.22099994, 1.5, "NW", 1], [8.47965933, -10.88948939, 74.22099994, 1.5, "NW", 10], [15.38036833, -10.88948939, 74.22099994, 1.5, "NW", 20]], columns=["Velocity", "X", "Y", "Z", "wind_direction", "wind_speed"])

Velocity  X      Y     Z  wind_direction wind_speed
0        -10.88 74.22 1.5 NW             0
0.82     -10.89 74.22 1.5 NW             1
8.48     -10.89 74.22 1.5 NW             10
15.38    -10.89 74.22 1.5 NW             20

它代表了针对特定坐标(X、Y、Z)和两个边界条件(wind_direction和wind_speed)进行CFD模拟的结果。

我想要估算同一点(X、Y、Z)、相同风向,但中间风速(例如4.6)的速度。我在我的数据框中有这个额外的行。

NaN -10.89 74.22 1.5 NW 4.6
现在我想根据风速插值填充NaN。对于上面的示例,我期望得到6.643773541。
这个数字来自线性插值:
0.82 + (4.6 - 1)/(10 - 1) * (8.48 - 0.82)
有什么想法吗?谢谢
更新
我已经找到了解决上述问题的方法。诀窍是使用groupby并定义一个函数,在通过groupby创建的数据帧上进行插值并传递给apply()。在我的情况下,这是函数。
def interp(x, wind_speed):
    g = interpolate.interp1d(np.array(x["wind_speed"]), np.array(x["Velocity"]))
    return g(wind_speed)

这是我的分组依据

group = df.groupby("point").apply(interp, wind_speed)

函数interp必须使用一个参数来表示插值操作的位置。

我想知道是否有更好的方法来完成它。


3
使用set_index将需要插值的值放置在索引中,例如data.set_index('wind_speed')['Velocity'].interpolate(method='index')。interpolate方法没有levels参数,不确定此处是否需要。 - TomAugspurger
1
谢谢。这只是数据框中的一个点,每个点都有相同的4个风速,我用它们进行模拟。因此,索引不会是唯一的。典型的完整数据框将为我测试的每个风向和每个风速重复相同的点集。 - Rojj
2个回答

7
我的解决方案是通过以下方式对“风速”进行索引:
df.set_index('wind_speed', inplace=True)

然后我通过索引列进行插值。
df.interpolate(method='index', inplace=True)

现在我可以返回之前的状态。
df.reset_index(inplace=True)

如果顺利的话,请告诉我...


1
这是一个更简单的解决方案,除了'inplace=True'。它会使df变成'None'并最终产生'AttributeError: 'NoneType' object has no attribute 'interpolate''。我跳过了'inplace'并得出了正确的答案。 - Brom
1
inplace=True 使命令返回 None,但是结果将应用于 df - DomingoR

1
我已经找到了解决以上问题的方法。诀窍是使用groupby并定义一个函数,该函数在通过groupby创建的数据帧上进行插值,并传递给apply()。在我的情况下,这是函数。
def interp(x, wind_speed):
    g = interpolate.interp1d(np.array(x["wind_speed"]), np.array(x["Velocity"]))
    return g(wind_speed)

这是我的分组依据。
group = df.groupby("point").apply(interp, wind_speed)

函数interp必须使用一个参数来表示插值的位置。

我想知道是否有更好的方法来实现它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接