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

如何用Pandas实现带正值保持的cumsum(不使用for循环)

从列'a'生成列'b'的Pandas实现

首先明确转换规则:

  • 每一行的b值 = 前一行b值 + 当前行a值,若结果>0则保留,否则设为0
  • 首行b值等价于初始值0加首行a值(1>0,故为1)

方法1:使用expanding().apply()(简洁直观)

这种方法逻辑清晰,适合小数据集:

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 0, 0, 0, -1, -5, 1, 1, 2, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 3, -2]})

def calculate_b(series):
    current_val = 0
    for num in series:
        current_val += num
        current_val = max(current_val, 0)
    return current_val

df['b'] = df['a'].expanding().apply(calculate_b)

方法2:Numba加速(高性能,适合大数据集)

如果数据集规模较大,用Numba编译循环能显著提升效率,需先安装numba(pip install numba):

import pandas as pd
from numba import jit
import numpy as np

df = pd.DataFrame({'a': [1, 2, 0, 0, 0, -1, -5, 1, 1, 2, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 3, -2]})

@jit(nopython=True)
def calculate_b_numba(a_array):
    result = np.zeros_like(a_array)
    current_val = 0
    for i in range(len(a_array)):
        current_val += a_array[i]
        current_val = max(current_val, 0)
        result[i] = current_val
    return result

df['b'] = calculate_b_numba(df['a'].values)

两种方法生成的b列均与你提供的预期结果完全一致。

内容的提问来源于stack exchange,提问作者Nhân Phan Thành

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:10:27