You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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")

运行结果

针对你给出的测试数据,最终输出结果如下:

symbolmin_sell_minus_buymax_sell_minus_buymean_sell_minus_buywav_sell_minus_buy
10000380.0010.00110.0010.003
10000390.0040.0250.0050.006

内容的提问来源于stack exchange,提问作者darren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:36:03