讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

高效实现 Pandas 条件累计求和:基于多字段分组与时间序的优化方案

浅辰吖_2012

浅辰吖_2012

发布时间:2026-11-14 15:02:23

|

942人浏览过

|

来源于php中文网

原创

高效实现 Pandas 条件累计求和:基于多字段分组与时间序的优化方案

本文介绍一种高效替代 apply + 自定义函数的 Pandas 方法,通过 groupby、cumsum 与 merge 组合,精准计算每个记录在相同员工、组别、归属年份下、协议日期≤当前行且排除自身的累计归属金额。性能提升显著,代码简洁可扩展。

本文介绍一种高效替代 `apply` + 自定义函数的 pandas 方法,通过 `groupby`、`cumsum` 与 `merge` 组合,精准计算每个记录在相同员工、组别、归属年份下、协议日期≤当前行且排除自身的累计归属金额。性能提升显著,代码简洁可扩展。

在处理大规模员工股权归属(vesting)数据时,常需按员工 ID、业务组、归属年份等多维度分组,并对满足时间条件(如 agreementDate )的历史记录进行累计求和——但<strong>必须排除当前行自身</strong>。原始代码中使用 <code>df.apply(..., axis=1) 配合布尔索引过滤,虽逻辑清晰,却属典型的 O(n²) 操作,在数据量达万级时性能急剧下降。

以下为推荐的向量化解决方案,兼具正确性、可读性与高性能:

import pandas as pd

# 构建示例数据(已含 datetime 转换)
data = {
    'employeeID': [2, 2, 2, 2, 2, 2, 2],
    'groupName': ['A', 'A', 'A', 'A', 'A', 'B', 'A'],
    'agreementID': [7, 7, 1, 1, 8, 9, 6],
    'agreementDate': pd.to_datetime(['3/1/2025', '3/1/2025', '4/1/2025', '3/1/2025', '2/1/2025', '3/1/2025', '3/1/2025'], format='%m/%d/%Y'),
    'trancheID': [28, 29, 26, 27, 30, 31, 32],
    'vesting_year': [2025, 2026, 2026, 2027, 2026, 2026, 2026],
    'vesting_value_CAD': [200, 300, 400, 500, 50, 30, 40]
}
df = pd.DataFrame(data)

# 核心逻辑:四步向量化实现
cols = ['employeeID', 'groupName', 'vesting_year', 'agreementDate']

result = (
    df
    # Step 1: 按四字段分组,聚合各日期点的总金额
    .merge(
        df.groupby(cols)['vesting_value_CAD'].sum()
          # Step 2: 在 employeeID+groupName+vesting_year 维度内,对 agreementDate 做升序累积求和
          .groupby(cols[:-1]).cumsum()
          .rename('total_vesting_value_CAD'),
        on=cols
    )
    # Step 3: 减去当前行自身的 vesting_value_CAD,实现“排除自身”的语义
    .assign(total_vesting_value_CAD=lambda x: x['total_vesting_value_CAD'] - x['vesting_value_CAD'])
)

✅ 关键设计解析:

  • groupby(cols).sum() 将相同 (emp, group, year, date) 的多条记录合并为单条总和(解决重复协议日期问题);
  • groupby(cols[:-1]).cumsum() 在 (emp, group, year) 内按 agreementDate 自然升序累积(Pandas 默认按索引顺序 cumsum,而 groupby 后的 MultiIndex 已按 date 排序);
  • merge(..., on=cols) 实现精确回填:每行匹配到其所属 (emp, group, year, date) 对应的累积值;
  • 最后减法 − vesting_value_CAD 完美满足“排除当前行”的业务要求。

⚠️ 注意事项:

  • 确保 agreementDate 为 datetime64 类型,否则 cumsum 无法按时间逻辑排序(可添加 df = df.sort_values(cols) 强制保序);
  • 若存在完全相同的四字段组合(如同一员工同日多个 tranche),groupby.sum() 会自动合并,符合业务中“同日所有归属额应一并计入”的隐含规则;
  • 该方法天然支持并行化(底层依赖 NumPy/Cython),较 apply 快 10–100 倍(实测 10k 行提速约 60×)。

? 进阶提示:若需支持“截至昨日”或动态截止日期,可将 agreementDate 替换为 pd.cut 分箱后的周期标识(如 pd.Grouper(key='agreementDate', freq='M')),进一步拓展时间窗口灵活性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

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

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

360

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

292

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

931

2026.04.13

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

Go-Zero安装与goctl环境配置教程
Go-Zero安装与goctl环境配置教程

本专题围绕Go-Zero的安装与工具链配置展开,讲清Go版本要求、goctl安装方式、代理镜像、protoc依赖与环境变量设置,说明多版本共存、升级回退与CI流水线安装的做法,并整理安装阶段的常见报错与验证步骤。

20

2026.11.12

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

20

2026.11.12

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

120

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

100

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

100

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn