cumsum()和cummax()不属于Python内置函数,需用NumPy或Pandas;list不能直接调用,须先转为ndarray或Series;itertools.accumulate()可纯Python实现累积运算。

用 cumsum() 做累积求和,别直接套在 list 上
Python 里没有内置的 cumsum(),它属于 NumPy 和 Pandas——不是 Python 标准库函数。直接对普通 list 调用会报 AttributeError: 'list' object has no attribute 'cumsum'。
常见错误是写成:[1,2,3].cumsum(),这肯定失败。得先转成 numpy.ndarray 或 pandas.Series。
- NumPy 场景:用
np.cumsum([1,2,3])→ 返回array([1, 3, 6]),支持 axis 参数,适合多维数组按行/列累积 - Pandas 场景:
pd.Series([1,2,3]).cumsum()→ 返回Series,保留索引,空值默认跳过(skipna=True) - 如果数据含
NaN,NumPy 的cumsum()会污染后续结果(变成全nan),Pandas 默认跳过,行为更稳健
cummax() 不是内置函数,也不是 math 模块里的
和 cumsum() 一样,cummax() 也只存在于 Pandas 和 NumPy(后者叫 cummax,但需从 numpy.ufunc 显式调用,极少用)。别在 math、itertools 或纯 Python 循环里找它。
最常用路径就是 Pandas:pd.Series([3,1,4,1,5]).cummax() →
0 3<br>1 3<br>2 4<br>3 4<br>4 5。
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 参数少但关键:
skipna=True(默认)遇到NaN就跳,设为False则第一个NaN后全变NaN - 对 DataFrame 调用时,必须指定
axis(0或1),否则报错:TypeError: cummax() missing 1 required positional argument: 'axis' - 性能上,Pandas
cummax()对大 Series 比手写循环快一个数量级;但若只是几个数,纯 Pythonitertools.accumulate()配max更轻量
想用纯 Python 实现累积最大值?itertools.accumulate() 是正解
不用 Pandas 也能做,关键是用对函数。别写三层 for 循环或手动维护变量——itertools.accumulate() 就是干这个的。
示例:from itertools import accumulate; list(accumulate([3,1,4,1,5], max)) → [3, 3, 4, 4, 5]。
-
accumulate(iterable, func)第二个参数必须是二元函数,max符合要求,sum也行(等价于cumsum) - 注意返回的是迭代器,要结果得转
list或遍历;不转就用一次失效 - 跟 Pandas 行为差异:它不处理
None或NaN,遇到就报TypeError: unorderable types: int() > NoneType(),得提前过滤
DataFrame 里混用 cumsum() 和 cummax() 容易丢列名或广播错
对整个 DataFrame 调用这些方法时,它们默认按列(axis=0)计算,返回仍是 DataFrame,但列顺序不变、索引不变——这点常被忽略,导致后续 merge 或 plot 出错。
典型陷阱:df[['A','B']].cumsum() 结果列名还是 A、B,但如果你原意是“对每行累加”,却忘了写 axis=1,结果就完全不对。
- 确认方向:按行累积用
axis=1,按列用axis=0(默认) - 混合数据类型列(比如一列是
str)会导致整列被跳过或报错,Pandas 会静默跳过非数值列,NumPy 则直接炸掉 - 链式调用要注意:
df.fillna(0).cumsum().round(2)没问题,但df.cumsum().fillna(0)可能填错位置——因为cumsum()后的NaN分布已变
list、ndarray 还是 Series,以及 NaN 在哪、要不要参与计算。这几个函数对输入类型和缺失值太敏感,动不动就静默跳过或全盘崩掉。

















