gpt4 book ai didi

python - 对数据框中的一组选定行执行数学运算的最有效方法是什么

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:09 25 4
gpt4 key购买 nike

我有一个以下格式的 Pandas Dataframe:

Location| X | Y
----------------
A1 | 1 | 2
A1 | 2 | 3
A2 | 1 | 1
A2 | 2 | 3
etc...many locations...many values

我想获取一个位置中所有值的一阶导数,并将其作为 X1 附加到原始数据帧。

Location| X | Y | X'
--------------------
A1 | 1 | 2 |
A1 | 2 | 3 |
A2 | 1 | 1 |
A2 | 2 | 3 |
etc...many locations...many values

最有效/最优雅的方法是什么?我有一个看起来像这样的方法:

1.) 获取所有唯一位置。

2.) 迭代所有位置以仅获取与循环中的位置匹配的行。

 grad_dict = {}
for location in locations:
selected_rows = df.query('{0} == "{1}")
temp_df = np.gradient(selected_rows['X'])
grad_dict[location] = temp_df

3.) 将所有字典连接在一起,如下所示:

result = pd.concat([grad_dict[location] for location in locations])

注意:此代码可能存在一些小问题,例如我当前并未真正将此值添加到 Dataframe 中。但更广泛的一点是我下面的问题。

我的问题:这是最优雅/最有效的方式吗?有没有更优雅/更快的方法?当位置很多时,此操作有时可能需要几秒钟。

最佳答案

如果我理解正确,您应该能够执行groupby并使用transform:

df["X'"] = df.groupby('Location')['X'].transform(np.gradient)

一般来说,如果您想对 DataFrame 的多个子部分执行相同的操作,groupby 是最佳选择。

结果输出:

  Location  X  Y  X'
0 A1 1 2 1
1 A1 2 3 1
2 A2 1 1 1
3 A2 2 3 1

编辑

如果您想向 np.gradient 提供其他参数,可以将它们作为 transform 的参数提供。例如:

df["X'"] = df.groupby('Location')['X'].transform(np.gradient, 0.5, edge_order=2)

如果您需要做一些更复杂的事情,您可以编写一个 lambda 函数来指定您想要执行的操作,或者单独定义一个自定义函数并将其传递给 transform。如果可以的话,您应该使用上面的方法,因为创建 lambda 会稍微慢一些:

df["X'"] = df.groupby('Location')['X'].transform(lambda x: np.gradient(x, 0.5, edge_order=2))

关于python - 对数据框中的一组选定行执行数学运算的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42584913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com