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

Pandas:如何用cumsum实现带范围约束的累计差值计算

问题:计算带取值范围约束的累计差值列C

现有如下Pandas DataFrame:

A     B
   5     0
   5     10
   5     0
   5     0
   5     50

需要计算列C,规则为:

  • C是B与A的累计差值(每一步计算为上一步的C值加上当前行的B - A)
  • C的取值必须限制在0到15之间(不能小于0,也不能大于15)

如何实现并得到如下目标结果?

A     B     C
   5     0     0
   5     10    5
   5     0     0
   5     0     0
   5     50    15

解决方案

原生cumsum仅做纯累加,无法直接处理边界约束,但可以结合边界截断函数,通过自定义逻辑实现需求:

方法1:循环实现(小数据量友好)

import pandas as pd
import numpy as np

# 构造原始数据
df = pd.DataFrame({'A': [5,5,5,5,5], 'B': [0,10,0,0,50]})

# 计算每行的增量值
delta = df['B'] - df['A']

# 初始化C列,第一行先做截断
c_vals = [np.clip(delta.iloc[0], 0, 15)]

# 逐行计算带约束的累计值
for i in range(1, len(df)):
    temp = c_vals[-1] + delta.iloc[i]
    c_vals.append(np.clip(temp, 0, 15))

# 将结果赋值给C列
df['C'] = c_vals

print(df)

方法2:自定义累加函数(大数据量可选)

用expanding.apply或自定义遍历函数,避免显式循环的写法:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [5,5,5,5,5], 'B': [0,10,0,0,50]})

def constrained_cumsum(increments):
    current = 0
    result = []
    for inc in increments:
        current += inc
        # 应用边界约束
        current = max(0, min(current, 15))
        result.append(current)
    return result

df['C'] = constrained_cumsum(df['B'] - df['A'])

两种方法都能得到符合要求的C列结果。

内容的提问来源于stack exchange,提问作者RomB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:05:05