如何在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
相关产品推荐
相关产品推荐

