Pandas实现连续同id与user_num事件的duration列累计求和
Pandas 连续同属性行分组累加实现方案
实现思路
此前方案出现错误累加的原因,是直接按id、user_num分组时,会把所有非连续的同属性行划入同一组,导致跨段累加。正确逻辑是先根据行的相邻属性连续性生成独立的连续块标记,再按连续块分组完成累计计算。
可落地代码步骤
- 标记相邻行的属性匹配关系:对比当前行与上一行的
id、user_num取值,判断是否属于同一个连续块# 第一行没有上一行数据,默认作为新连续块的起始点 adjacent_match = ( (df['id'] == df['id'].shift()) & (df['user_num'] == df['user_num'].shift()) ).fillna(False) - 生成连续块唯一标识:遇到与上一行属性不匹配的位置,累计值加1,保证同一连续块内的行获得相同的组ID
df['block_id'] = (~adjacent_match).cumsum() - 按连续块分组,逐行累加
duration值df['duration'] = df.groupby('block_id')['duration'].cumsum() - 删除临时生成的分组标记列,即可得到目标输出
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
相关产品推荐
相关产品推荐

