Pandas多列分组后计算结果广播至原DataFrame每行问题求助
问题解决:Pandas分组计算后填充对应行的fprice值
问题原因
你当前的代码存在两个关键问题:
- 使用
groupby().apply()计算出每个组的单个fprice值后,直接reset_index(drop=True)会丢失原分组的索引关联,导致赋值时仅按位置顺序填充,无法和原DataFrame的分组正确匹配。 - 分组列使用了大写的
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
相关产品推荐
相关产品推荐

