如何在Pandas分组/透视表中添加加权平均列并合并为单一数据框
解决方案
先明确核心计算逻辑:对每个交易员,先算出各策略的权重(该策略股数 ÷ 交易员总股数),再用「权重 × MTD Rate」求和得到该交易员的加权平均价格。下面是具体实现步骤:
步骤1:给数据添加交易员总股数列
用transform方法计算,既能得到分组统计值,又不会破坏原数据的结构:
# 假设你的数据框名为df,包含列:Trader(交易员)、Strategy(策略)、Shares(股数)、MTD_Rate(MTD收益率) df['Total_Shares_Per_Trader'] = df.groupby('Trader')['Shares'].transform('sum')
步骤2:计算单策略权重与加权贡献
# 计算单策略占交易员总股数的权重 df['Weight'] = df['Shares'] / df['Total_Shares_Per_Trader'] # 计算该策略对加权平均的贡献值 df['Weighted_Rate'] = df['Weight'] * df['MTD_Rate']
步骤3:计算加权平均并合并到你的透视表
先算出每个交易员的加权平均价格,再合并到已有的透视表中:
# 按交易员分组求和,得到每个交易员的加权平均价格 weighted_avg = df.groupby('Trader')['Weighted_Rate'].sum().reset_index(name='Weighted_Avg_Price') # 合并到透视表(根据你的透视表结构选对应方式) # 如果透视表以Trader为索引: pivot_df = pivot_df.merge(weighted_avg, left_index=True, right_on='Trader', how='left') # 如果透视表有单独的Trader列: pivot_df = pivot_df.merge(weighted_avg, on='Trader', how='left')
步骤4:调整列顺序(把加权平均列放到MTD Rate旁边)
用列名列表手动指定顺序,保证排版整洁:
# 示例:把Weighted_Avg_Price放到MTD_Rate后面 new_col_order = ['Trader', 'Strategy', 'Shares', 'MTD_Rate', 'Weighted_Avg_Price'] + [col for col in pivot_df.columns if col not in ['Trader', 'Strategy', 'Shares', 'MTD_Rate', 'Weighted_Avg_Price']] pivot_df = pivot_df[new_col_order]
完整模拟示例
import pandas as pd # 模拟你的业务数据 data = { 'Trader': ['Alice', 'Alice', 'Bob', 'Bob', 'Bob'], 'Strategy': ['A', 'B', 'A', 'C', 'D'], 'Shares': [1000, 2000, 1500, 500, 1000], 'MTD_Rate': [0.05, 0.08, 0.03, 0.10, 0.06] } df = pd.DataFrame(data) # 执行上述所有步骤 df['Total_Shares_Per_Trader'] = df.groupby('Trader')['Shares'].transform('sum') df['Weight'] = df['Shares'] / df['Total_Shares_Per_Trader'] df['Weighted_Rate'] = df['Weight'] * df['MTD_Rate'] # 创建你已有的透视表结构 pivot_df = df.pivot_table(index=['Trader', 'Strategy'], values=['Shares', 'MTD_Rate'], aggfunc='first').reset_index() # 合并加权平均列并调整顺序 weighted_avg = df.groupby('Trader')['Weighted_Rate'].sum().reset_index(name='Weighted_Avg_Price') pivot_df = pivot_df.merge(weighted_avg, on='Trader', how='left') pivot_df = pivot_df[['Trader', 'Strategy', 'Shares', 'MTD_Rate', 'Weighted_Avg_Price']] print(pivot_df)
运行后就能得到Weighted_Avg_Price列紧邻MTD_Rate的整洁DataFrame,每个交易员的所有策略行都会显示对应的加权平均价格。如果你的现有透视表结构特殊,只需要调整merge时的关联键即可适配。
内容的提问来源于stack exchange,提问作者Troy Draizen
相关产品推荐
相关产品推荐

