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

如何实现DataFrame列的非负累积和?遇报错及结果异常求助

计算Pandas DataFrame列的非负累积和

需求说明

需要计算df["Size"]列的累积总和,要求所有结果不得低于0,预期输出如下:

Cumulative
0        11
1        29
2        16
3        12
4         0 
5        30

现有方法的问题分析

方法1:lambda结合apply

代码:

df.Size = df.Size.astype(int)
df["Cumulative"] = df.Size.apply(lambda x: x.cumsum() if x.cumsum() > 0 else 0)
print(df)

报错:

AttributeError: 'int' object has no attribute 'cumsum'

错误原因:apply会将Size列的每个单独元素传入lambda,而cumsum()是Pandas Series的方法,单个int/float对象没有这个属性,因此触发报错。

方法2:直接使用cumsum

代码:

df.Size = df.Size.astype(int)
df["Cumulative"] = df.Size.cumsum()

结果出现负值:

Cumulative
0         11
1         29
2         16
3         12
4        -14
5         16

问题:普通cumsum()仅做累加计算,没有添加非负限制逻辑,导致结果出现负值。

正确实现方法

方法1:使用itertools.accumulate(推荐,效率高)

利用itertools.accumulate逐个维护累加状态,每次取累加结果与0的最大值,确保非负:

import pandas as pd
from itertools import accumulate

# 示例数据(根据预期输出反推)
df = pd.DataFrame({"Size": [11, 18, -13, -4, -12, 30]})
df["Size"] = df["Size"].astype(int)

# 计算非负累积和
df["Cumulative"] = list(accumulate(df["Size"], lambda acc, current: max(acc + current, 0)))
print(df)

输出结果:

Size  Cumulative
0    11          11
1    18          29
2   -13          16
3    -4          12
4   -12           0
5    30          30

方法2:使用Pandas expanding().apply

通过expanding窗口逐行计算累加和,并限制最小值为0:

df["Cumulative"] = df["Size"].expanding().apply(lambda s: max(s.sum(), 0), raw=True)

raw=True参数可以提升处理效率,避免将数据转换为Series对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:20:25