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

pandas中带条件调整的cumsum累积求和向量化实现方案寻求

Pandas 带条件重置的累积求和向量化实现

实现思路

核心逻辑拆分为两步:

  1. 识别每次B列归零的位置作为分段边界,每一段内独立执行累积计算
  2. 每段内同时计算两个值: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:10