如何在DataFrame中按symbol分组计算每组买卖行对应数值的差值
正确实现方案
你之前的代码问题在于没有按symbol分组就直接做全表diff,一旦symbol的排序不连续或者出现缺失行,就会出现跨symbol计算的错误,而且只覆盖了mean和wav两列,没有处理min、max字段。
下面给出两种高效的向量化实现,都不需要遍历行:
方案1:用pivot透视表实现(性能最优)
先把side字段转成列索引,直接做列级别的减法,逻辑最直观:
# 指定要计算差值的数值列 num_cols = ["min", "max", "mean", "wav"] # 按symbol聚合,把side转成二级列索引 pivot_df = stats.pivot(index="symbol", columns="side", values=num_cols) # 直接用sell列减去对应buy列 diff_df = pivot_df.xs("sell", axis=1, level=1) - pivot_df.xs("buy", axis=1, level=1) # 重命名列+重置索引得到最终结果 diff_df = diff_df.add_suffix("_sell_minus_buy").reset_index()
方案2:用groupby分组实现
如果更习惯分组逻辑,用groupby的自定义计算也可以,性能和透视表方案几乎无差:
num_cols = ["min", "max", "mean", "wav"] def group_diff(group): sell_val = group.loc[group["side"] == "sell", num_cols].iloc[0] buy_val = group.loc[group["side"] == "buy", num_cols].iloc[0] return sell_val - buy_val diff_df = stats.groupby("symbol", group_keys=False).apply(group_diff).reset_index() diff_df = diff_df.add_suffix("_sell_minus_buy")
运行结果
针对你给出的测试数据,最终输出结果如下:
| symbol | min_sell_minus_buy | max_sell_minus_buy | mean_sell_minus_buy | wav_sell_minus_buy |
|---|---|---|---|---|
| 1000038 | 0.001 | 0.0011 | 0.001 | 0.003 |
| 1000039 | 0.004 | 0.025 | 0.005 | 0.006 |
内容的提问来源于stack exchange,提问作者darren
相关产品推荐
相关产品推荐

