Pandas无需循环实现零值间隔的time_diff分段累加赋值给time_adder的方法
解决方案
可以通过pandas向量化操作实现,完全避免Python层面的循环,性能比while循环提升1~2个数量级,具体实现逻辑如下:
核心思路
利用cumsum生成分组标识:每遇到time_adder初始值为0的位置,分组编号+1,同一个分组内的time_diff值做累计求和即可,初始为0的位置直接保留原值不参与计算。
完整代码
import pandas as pd from datetime import timedelta # ========== 核心实现 ========== # 1. 标记需要计算的位置:排除初始time_adder为0的行 calc_mask = df['time_adder'] != 0 # 2. 生成分组ID,每遇到0就进入新的分组 df['group_id'] = (df['time_adder'] == 0).cumsum() # 3. 按分组计算time_diff的累计和,赋值给对应位置 df.loc[calc_mask, 'time_adder'] = df[calc_mask].groupby('group_id')['time_diff'].cumsum() # 4. 可选:删除临时生成的group_id列 df.drop('group_id', axis=1, inplace=True)
效果验证
以你给出的数值示例验证:
- 初始
time_adder:[0, 0, NaN, NaN, NaN, NaN, 0, 0, NaN, NaN, 0...] - 对应
time_diff:[1,2,1,2,3,4,1,3,5,6...] - 计算后
time_adder:[0, 0, 1, 3, 6, 10, 0, 0, 5, 11, 0...],完全符合预期输出。
对于timedelta类型的time_diff,pandas原生支持cumsum运算,无需额外做类型转换,也符合你的时间差累加需求。
内容的提问来源于stack exchange,提问作者None
相关产品推荐
相关产品推荐

