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

Pandas多列分组后计算结果广播至原DataFrame每行问题求助

问题解决:Pandas分组计算后填充对应行的fprice值

问题原因

你当前的代码存在两个关键问题:

  1. 使用groupby().apply()计算出每个组的单个fprice值后,直接reset_index(drop=True)会丢失原分组的索引关联,导致赋值时仅按位置顺序填充,无法和原DataFrame的分组正确匹配。
  2. 分组列使用了大写的StartDate,但数据里的列名是小写的startdate,Pandas列名大小写敏感,这会导致分组逻辑失效。

正确解决方案

方法1:使用transform(推荐)

transform方法会自动将分组计算结果映射回原DataFrame的每一行,保持索引对应,完美适配你的需求:

df['fprice'] = df.groupby(['Deal', 'Commodity', 'startdate']).transform(
    lambda group: -(group['mtmvalue'].sum() - (group['fixedpricestrike'] * group['quantity']).sum()) / group['quantity'].sum()
)

方法2:先计算分组结果再合并

如果需要更清晰的步骤,可以先单独计算每个分组的fprice,再通过合并关联回原DataFrame:

# 计算分组的fprice,保留分组键作为合并依据
grouped_fprice = df.groupby(['Deal', 'Commodity', 'startdate']).apply(
    lambda group: -(group['mtmvalue'].sum() - (group['fixedpricestrike'] * group['quantity']).sum()) / group['quantity'].sum()
).reset_index(name='fprice')

# 合并回原DataFrame,确保每行匹配对应分组的fprice
df = df.merge(grouped_fprice, on=['Deal', 'Commodity', 'startdate'], how='left')

验证结果

针对你的测试数据,计算结果如下:

  • Sell组:-(200 - (10*20))/20 = 0,所有Sell行的fprice均为0
  • Buy组:-(75 - (5*15))/15 = 0,所有Buy行的fprice均为0
    完全符合同一分组每行fprice值一致的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:03:26