如何在Pandas/纯Python中实现遇到0时重置累计求和(cumsum)?
分段重置的累计求和实现方案
这是个非常实用的分段累计需求,我来分享两种靠谱的实现方式,分别适配Pandas场景和纯Python场景:
一、使用Pandas实现(高效简洁,推荐)
核心思路
我们可以先给每个分段生成唯一的分组标识:每当遇到值为0的元素时,就开启一个新的分组。然后对每个分组单独执行累计求和,这样就能实现遇到0就重置的效果。
代码示例
import pandas as pd # 构造你提供的原始Series orig = pd.Series([0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1]) # 生成分组键:每出现一个0,分组编号+1,以此划分独立分段 group_keys = (orig == 0).cumsum() # 按分组键分组后,对每个组执行累计求和 wanted_result = orig.groupby(group_keys).cumsum() # 输出验证 print(wanted_result)
输出结果
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 0 9 1 10 2 11 3 12 0 13 1 14 2 15 3 16 4 17 5 18 6 dtype: int64
完全匹配你想要的结果,而且Pandas的内置方法处理大数据量时效率很高。
二、纯Python实现(无需依赖库,逻辑直观)
如果你的场景不能使用Pandas,写个简单的循环就能解决问题,逻辑非常清晰:
核心思路
遍历原始序列,维护一个当前累计值的变量:
- 遇到0时,把当前累计值重置为0,直接加入结果列表
- 遇到非0值时,把当前值加到累计变量里,再加入结果列表
代码示例
orig = [0,1,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1] wanted_result = [] current_total = 0 for num in orig: if num == 0: current_total = 0 else: current_total += num wanted_result.append(current_total) print(wanted_result)
输出结果
[0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6]
这个方法适合小数据量或者需要轻量实现的场景,可读性拉满。
内容的提问来源于stack exchange,提问作者Ezer K
相关产品推荐
相关产品推荐

