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

标签 python pandas

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

相关文章:

python - RandomizedSearchCv 导致属性错误

python - 获取 Pandas 中两行之间的差异

python - 3d积分,python,积分集约束

Python设置为数组和数据框

python - 如何在 python 脚本中调试 KCL(python)?

python - PyYaml - 转储带有特殊字符(即重音符号)的 unicode

python - 为什么空字典大于 1?

python - 为什么 np.clip(pd.Series(range(10)), 2,3) 返回一个系列?

python - Pandas 的百分位排名

python - pandas 中的频率表(如 R 中的 plyr)