全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何在Pandas中按多列分组计算并广播结果到原始DataFrame的每一行

本文详解如何使用pandas对dataframe按多个列(如deal、commodity、startdate)分组,执行自定义聚合计算(如fprice公式),并将标量结果准确广播回原始数据的每一行,避免索引错位问题。

在Pandas中,对多列分组后进行聚合计算并“广播”结果到原始每行,是常见但易出错的操作。许多初学者尝试直接用 groupby(...).apply(...) 的返回值赋值给新列(如 df['fprice'] = ...),却因apply返回的是缩减后的Series(索引为分组键),而原始DataFrame索引未对齐,导致赋值错位(如示例中J2被错误赋予1.25)、部分行缺失或NaN——这正是原问题的核心症结。

✅ 正确做法是:分离计算与对齐两个步骤——先独立计算每组的聚合值,生成一个含分组键和结果的中间表;再通过merge(或map)将其安全、精确地回填至原始DataFrame。

以下为完整、可复现的解决方案:

import pandas as pd

# 示例数据(注意列名大小写需与实际一致)
df = pd.DataFrame({
    'ID': ['J1', 'J2', 'J3', 'J4'],
    'Deal': ['Sell', 'Sell', 'Buy', 'Buy'],
    'Party': ['J', 'J', 'J', 'J'],
    'Commodity': ['(stock1, stock2)'] * 4,
    'startdate': ['01Jan23'] * 4,
    'enddate': ['01Feb23'] * 4,
    'fixedpricestrike': [10.0, 10.0, 5.0, 5.0],
    'quantity': [10, 10, 10, 5],
    'mtmvalue': [100.0, 100.0, 50.0, 25.0]
})

# ✅ 步骤1:分组聚合,计算每组的 fprice(公式:-(∑mtm - ∑(strike×qty)) / ∑qty)
fprice_series = df.groupby(['startdate', 'Commodity', 'Deal']).apply(
    lambda g: -(g['mtmvalue'].sum() - (g['fixedpricestrike'] * g['quantity']).sum()) / g['quantity'].sum()
)

# 将结果转为DataFrame,重命名列为'fprice'
grouped_fprice = fprice_series.reset_index(name='fprice')

# ✅ 步骤2:左连接回原始DataFrame(关键!确保每行按分组键精准匹配)
df = pd.merge(df, grouped_fprice, on=['startdate', 'Commodity', 'Deal'], how='left')

print(df)

输出结果将严格符合预期:

   ID  Deal Party         Commodity startdate  enddate  fixedpricestrike  quantity  mtmvalue  fprice
0  J1  Sell     J  (stock1, stock2)   01Jan23  01Feb23              10.0        10.0     100.0     0.0
1  J2  Sell     J  (stock1, stock2)   01Jan23  01Feb23              10.0        10.0     100.0     0.0
2  J3   Buy     J  (stock1, stock2)   01Jan23  01Feb23               5.0        10.0      50.0    1.25
3  J4   Buy     J  (stock1, stock2)   01Jan23  01Feb23               5.0         5.0      25.0    1.25

? 关键注意事项:

  • 列名一致性:merge的on参数必须与groupby键完全一致(包括大小写、空格),否则合并失败或产生NaN。
  • 性能考量:对超大数据集,merge比map稍慢但更鲁棒;若分组键唯一且为字符串/数值,也可用df['fprice'] = df.set_index(['startdate','Commodity','Deal']).index.map(fprice_series)。
  • 公式验证:本例中Buy组计算为 -(50+25 - (5×10 + 5×5)) / (10+5) = -(75 - 75)/15 = 0?但原文示例为1.25,说明实际业务逻辑可能不同,请务必根据真实公式调整lambda内计算逻辑。
  • 缺失值处理:how='left'确保原始行不丢失;若某组在聚合中无结果(如全NaN),对应fprice将为NaN,建议后续用df['fprice'].fillna(0)处理。

掌握“先聚合、再对齐”的范式,即可稳健解决任意多列分组广播问题,远离索引陷阱。


# 大数据  # app  # pandas  # 字符串  # Lambda  # map  # 每组  # 的是  # 多个  # 将其  # 并将  # 自定义  # 将为  # 如何使用  # 却因  # 重命名 


相关文章: 电脑免费海报制作网站推荐,招聘海报哪个网站多?  宝盒自助建站智能生成技巧:SEO优化与关键词设置指南  建站之星展会模版如何一键下载生成?  建站之星伪静态规则如何正确配置?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何通过免费商城建站系统源码自定义网站主题与功能?  如何快速生成专业多端适配建站电话?  建站之星北京办公室:智能建站系统与小程序生成方案解析  建站主机选购指南:核心配置优化与品牌推荐方案  如何用PHP快速搭建CMS系统?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  制作旅游网站html,怎样注册旅游网站?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何快速建站并高效导出源代码?  建站与域名管理如何高效结合?  如何快速使用云服务器搭建个人网站?  如何设计高效校园网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何通过.red域名打造高辨识度品牌网站?  如何快速搭建高效服务器建站系统?  建站之星3.0如何解决常见操作问题?  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  兔展官网 在线制作,怎样制作微信请帖?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  定制建站如何定义?其核心优势是什么?  如何在Ubuntu系统下快速搭建WordPress个人网站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  广州商城建站系统开发成本与周期如何控制?  *服务器网站为何频现安全漏洞?  建设网站制作价格,怎样建立自己的公司网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  昆明高端网站制作公司,昆明公租房申请网上登录入口?  如何在阿里云虚拟主机上快速搭建个人网站?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何快速启动建站代理加盟业务?  javascript基本数据类型及类型检测常用方法小结  如何零基础开发自助建站系统?完整教程解析  文字头像制作网站推荐软件,醒图能自动配文字吗?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  外贸公司网站制作,外贸网站建设一般有哪些步骤?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  建站10G流量真的够用吗?如何应对访问高峰?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  安徽网站建设与外贸建站服务专业定制方案  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  小建面朝正北,A点实际方位是否存在偏差?  jQuery 常见小例汇总  建站之星免费版是否永久可用?  深圳企业网站制作设计,在深圳如何网上全流程注册公司? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。