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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:02:53