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

Pandas实现连续同id与user_num事件的duration列累计求和

Pandas 连续同属性行分组累加实现方案

实现思路

此前方案出现错误累加的原因,是直接按id、user_num分组时,会把所有非连续的同属性行划入同一组,导致跨段累加。正确逻辑是先根据行的相邻属性连续性生成独立的连续块标记,再按连续块分组完成累计计算。

可落地代码步骤

  1. 标记相邻行的属性匹配关系:对比当前行与上一行的id、user_num取值,判断是否属于同一个连续块
    # 第一行没有上一行数据,默认作为新连续块的起始点
    adjacent_match = (
        (df['id'] == df['id'].shift())
        & (df['user_num'] == df['user_num'].shift())
    ).fillna(False)
    
  2. 生成连续块唯一标识:遇到与上一行属性不匹配的位置,累计值加1,保证同一连续块内的行获得相同的组ID
    df['block_id'] = (~adjacent_match).cumsum()
    
  3. 按连续块分组,逐行累加duration值
    df['duration'] = df.groupby('block_id')['duration'].cumsum()
    
  4. 删除临时生成的分组标记列,即可得到目标输出
    df = df.drop(columns=['block_id'])
    

逻辑匹配说明

按上述步骤输出的结果与预期完全一致:

  • 记录按原始顺序排列时,相邻行id、user_num完全相同才会被划入同一个累计块
  • 一旦相邻行的属性出现差异,累计值直接重置,从当前行重新开始累加
  • 后续再次出现与之前相同的id、user_num组合时,只要中间插入了其他属性的行,就会作为新的累计块独立计算,不会关联历史记录的累加值

备注:原始样例数据中存在两处笔误:第7行duration值写为21463.0 0、第8行user_key写为12470010,修正为与目标值一致的内容后即可正常运行。

内容的提问来源于stack exchange,提问作者Bruno Miguel Gonçalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 13:06:03