如何实现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
相关产品推荐
相关产品推荐

