df["Size"] 应该输出一个新的累计总数,并且不允许总和低于 0:
Size
0 11.0
1 18.0
2 -13.0
3 -4.0
4 -26.0
5 30.0
print(df["Cumulative"]) 输出应为:
Cumulative
0 11
1 29
2 16
3 12
4 0
5 30
我希望 lambda 可能有所帮助,但我收到错误:
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'
无论输入什么数据类型“str”、“float”都会出现此错误
或者我从以下开始:
df.Size = df.Size.astype(int)
df["Cumulative"] = df.Size.cumsum()
输出:
Cumulative
0 11
1 29
2 16
3 12
4 -14
5 16
此输出按预期工作,但不会阻止结果降至 0 以下
最佳答案
更新
您必须使用 itertools
中的 accumulate
:
from itertools import accumulate
def reset_cumsum(bal, val):
return max(bal + val, 0) # Enhanced by @Chrysophylaxs
# return bal if (bal := bal + val) > 0 else 0
df['Cumulative'] = list(accumulate(df['Size'], func=reset_cumsum, initial=0))[1:]
print(df)
# Output
Size Cumulative
0 11.0 11.0
1 18.0 29.0
2 -13.0 16.0
3 -4.0 12.0
4 -26.0 0.0
5 30.0 30.0
您可以使用扩展
并计算每次迭代的总和。如果总和大于 0,则返回总和,否则返回 0:
>>> df['Size'].expanding().apply(lambda x: c if (c := x.sum()) > 0 else 0)
0 11.0
1 29.0
2 16.0
3 12.0
4 0.0
5 16.0
Name: Size, dtype: float64
关于python - 属性错误: 'str' object has no attribute 'cumsum' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75348576/