0

0

Pandas GroupBy多列聚合后广播结果回原始行的正确方法

花韻仙語

花韻仙語

发布时间:2025-12-31 13:20:03

|

822人浏览过

|

来源于php中文网

原创

Pandas GroupBy多列聚合后广播结果回原始行的正确方法

使用pandas对dataframe按多列分组计算指标(如加权平均、调整价等),再将标量结果广播到每组所有行,应避免直接用`groupby().apply()`赋值,而需先聚合生成映射表,再通过`merge`或`map`安全回填。

在pandas中,对多列(如 ['Deal', 'Commodity', 'startdate'])进行分组并为每组计算一个汇总值(例如自定义公式得出的 fprice),然后将该值广播(broadcast)到组内每一行,是常见但易出错的操作。问题核心在于:df.groupby(...).apply(...) 返回的是一个以分组键为索引的Series(或DataFrame),若直接赋值给新列(如 df['fprice'] = ...),pandas会尝试按原始DataFrame的索引对齐,而非按分组逻辑广播——这极易导致长度不匹配、索引错位或NaN填充,正如提问中出现的 J2 被错误赋予 1.25、而 J3/J4 反而缺失的结果。

✅ 正确做法是两步分离

  1. 先聚合:使用 groupby(...).apply(...) 或更高效的 agg() 计算每组的标量结果,得到一个带分组键的中间结果;
  2. 再回填:通过 merge(推荐,健壮且可读性强)或 map(适用于单键)将结果精准关联回原始行。

以下是以提问数据为例的完整实现:

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]
})

# Step 1: 按多列分组,计算每组 fprice(公式:-(∑mtm - ∑(strike×qty)) / ∑qty)
grouped_fprice = df.groupby(['Deal', 'Commodity', 'startdate']).apply(
    lambda g: -(g['mtmvalue'].sum() - (g['fixedpricestrike'] * g['quantity']).sum()) / g['quantity'].sum()
).reset_index(name='fprice')

# Step 2: 左连接回原表(确保每行都获得对应组的 fprice)
df = pd.merge(df, grouped_fprice, on=['Deal', 'Commodity', 'startdate'], how='left')

print(df)

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

Endel.io
Endel.io

Endel是一款可以创造个性化舒缓声音的应用程序,可帮助您集中注意力、放松身心和入睡。

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

? 关键注意事项

  • ❌ 避免 df['new_col'] = df.groupby(...).apply(...):apply 返回对象索引为分组键,与原df索引无直接对应关系,强制赋值会触发隐式对齐,引发错位;
  • ✅ merge 是最安全通用的方式,支持任意数量的分组键,且自动处理重复键、缺失组等边界情况;
  • ⚡ 若仅按单列分组,可用 map 提升性能:df['fprice'] = df['Deal'].map(grouped_fprice.set_index('Deal')['fprice']);
  • ? 公式中注意括号优先级与数据类型:确保 quantity 为数值型(非字符串),必要时添加 .astype(float);
  • ? 对于复杂计算,建议将逻辑封装为独立函数,提升可读性与复用性。

掌握这一“聚合→关联”范式,即可稳健实现多维分组指标的行级广播,是构建金融风控、交易分析等场景中衍生特征的基础技能。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

49

2025.12.04

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

297

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

552

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

95

2025.10.23

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

小游戏4399大全
小游戏4399大全

4399小游戏免费秒玩大全来了!无需下载、即点即玩,涵盖动作、冒险、益智、射击、体育、双人等全品类热门小游戏。经典如《黄金矿工》《森林冰火人》《狂扁小朋友》一应俱全,每日更新最新H5游戏,支持电脑与手机跨端畅玩。访问4399小游戏中心,重温童年回忆,畅享轻松娱乐时光!官方入口安全绿色,无插件、无广告干扰,打开即玩,快乐秒达!

30

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 39.7万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号