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

如何在Pandas中实现原表与聚合表的除法运算计算成交量占比?

解决方法

有两种简洁的方式可以实现你的需求,以下是具体步骤:

方法一:使用groupby.transform一步完成(推荐)

不需要单独生成聚合表,直接通过transform将分组后的总成交量广播到原DataFrame的对应行,然后计算占比:

# 计算每日每个交易所的总成交量,自动匹配到原表对应行
df['total_volume'] = df.groupby(['time', 'market'])['volume'].transform('sum')
# 计算成交量占比,保留两位小数并转为百分比
df['prod_vol'] = (df['volume'] / df['total_volume'] * 100).round(2)
# 若不需要中间列,可删除
# df.drop('total_volume', axis=1, inplace=True)

transform('sum')会针对time+market的每个分组计算总成交量,然后将该值填充到原分组的每一行,直接就能完成除法计算,比先聚合再合并更高效。

方法二:关联你已生成的聚合表

如果你想继续使用已生成的df_new,可以通过merge将其关联回原表:

# 重置聚合表的索引,将time、market转为普通列
df_new = df_new.reset_index()
# 重命名聚合后的volume列,避免和原表列名冲突
df_new.rename(columns={'volume': 'total_volume'}, inplace=True)
# 以time和market为关联键,将聚合表合并到原表
df = df.merge(df_new, on=['time', 'market'], how='left')
# 计算占比并格式化
df['prod_vol'] = (df['volume'] / df['total_volume'] * 100).round(2)

因为groupby后的结果默认将分组键设为索引,所以需要先reset_index()把它们转为普通列,才能和原表的对应列匹配关联。

验证结果后,你会得到和示例一致的prod_vol列,比如2022-07-01 Binance的btcusdt行,占比为18.75%,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:24:31