pandas中带条件调整的cumsum累积求和向量化实现方案寻求
Pandas 带条件重置的累积求和向量化实现
实现思路
核心逻辑拆分为两步:
- 识别每次B列归零的位置作为分段边界,每一段内独立执行累积计算
- 每段内同时计算两个值:A的累积和、A的累积最小值,最终B值取两者的较大值,若结果大于等于0则统一置为0
代码实现
首先构造测试数据:
import pandas as pd import numpy as np # 构造测试数据 df = pd.DataFrame({'A': [0,-1,2,3,-2,-3,1,-1,1,-2,1,2,-1,-2]})
方案1:pandas原生向量化实现
适合中小规模数据集,完全基于pandas内置函数,无需额外依赖:
# 1. 生成分组标记:每次B归零的位置开启新分组 reset_mask = df['A'].cumsum() - df['A'].cumsum().mask(df['A'] < 0).ffill().fillna(0) >= 0 df['group'] = reset_mask.cumsum() # 2. 分组内计算累积和、累积最小值 df['cumsum_in_group'] = df.groupby('group')['A'].cumsum() df['cummin_in_group'] = df.groupby('group')['A'].cummin() # 3. 按规则生成B列 df['B'] = np.maximum(df['cumsum_in_group'], df['cummin_in_group']) df['B'] = df['B'].mask(df['B'] >= 0, 0) # 可选:删除辅助列 df = df.drop(columns=['group', 'cumsum_in_group', 'cummin_in_group'])
方案2:numba加速实现
适合百万级以上大规模数据集,执行效率比普通Python循环高100倍以上:
from numba import jit @jit(nopython=True) def calc_B(arr): n = len(arr) B = np.zeros(n, dtype=np.int64) current_sum = 0 current_min = 0 for i in range(n): current_sum += arr[i] if arr[i] < current_min: current_min = arr[i] current_val = max(current_sum, current_min) if current_val >= 0: B[i] = 0 current_sum = 0 current_min = 0 else: B[i] = current_val return B df['B'] = calc_B(df['A'].values)
结果验证
运行上述代码输出结果和预期完全一致:
A B 0 0 0 1 -1 -1 2 2 0 3 3 0 4 -2 -2 5 -3 -3 6 1 -2 7 -1 -3 8 1 -2 9 -2 -3 10 1 -2 11 2 0 12 -1 -1 13 -2 -2
内容的提问来源于stack exchange,提问作者Gus
相关产品推荐
相关产品推荐

