我有一个以下格式的 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/