cumsum()和cumprod()可直接计算累计和与累计积,默认axis=0按列逐元素累积,返回同形状结果;支持NaN传播、布尔计数、行列方向控制及numeric_only参数跳过非数值列。

用 cumsum() 和 cumprod() 计算累计和与累计积
直接调用 Series 或 DataFrame 的 cumsum() 和 cumprod() 方法即可,它们默认按行(axis=0)逐元素累积,返回同形状的结果。不需要手动循环或 apply,底层用 C 实现,速度很快。
常见错误是误以为要先排序或重置索引——其实只要数据顺序符合业务逻辑(比如时间序列已按时间排序),结果就正确;若顺序乱了,先用 sort_values() 或 set_index() 整理好再算。
-
cumsum()对NaN值保持传播:遇到第一个NaN后,后续全为NaN -
cumprod()同样传播NaN,且若含 0,后续累积积会恒为 0(数学上合理) - 对布尔型数据,
cumsum()可当“计数器”用(True算 1,False算 0)
在 DataFrame 中按行或按列控制方向
DataFrame.cumsum(axis=0) 是默认行为(按列累积,即每列各自算自己的累计和),axis=1 才是按行累积(每行从左到右累加)。容易混淆的是“按行”这个说法——它不表示“逐行处理”,而是指沿着水平方向(列索引方向)滚动计算。
示例:df.cumsum(axis=1) 会让第 0 行变成 [a, a+b, a+b+c],而不是把所有行的第 0 列加起来。
立即学习“Python免费学习笔记(深入)”;
- 想对某几列单独计算?用列选择子集:
df[['col_a', 'col_b']].cumsum() - 想跳过非数值列?
cumsum(numeric_only=True)自动忽略字符串、日期等列(Pandas ≥ 1.5) - 旧版 Pandas(TypeError,需先
select_dtypes(include='number')
处理缺失值和类型转换的坑
如果原始列是整型但含 NaN,Pandas 会自动转成 float64(因为 NaN 是浮点概念)。这不是 bug,是设计使然。若后续要导出整数 CSV,得在最后用 fillna(0).astype(int),但注意:这会把原本的 NaN 强制变 0,可能掩盖数据问题。
- 不想让
NaN中断累积?先用fillna(0)再调cumsum()——但仅适用于“空值即零”的业务场景 -
cumprod()对负数敏感:交替正负会导致符号频繁翻转,容易引发数值溢出(尤其大数),可考虑先取对数再累加,最后指数还原 - 时间序列中用
datetime列调cumsum()会报错,必须先转成timedelta或数值单位(如天数)
替代方案:用 numpy 的 cumsum 更快但更糙
如果只处理纯数值 ndarray,np.cumsum(arr) 比 Pandas 版本快约 20–30%,且不带索引、不检查 dtype。但它不兼容 NaN(会返回 nan,但不会像 Pandas 那样“阻断后续”);而且一旦用了 np.cumsum,就得自己维护索引对齐,容易出错。
- 适合场景:清洗后确定无缺失、纯数字、且不需要保留 DataFrame 结构的中间计算
- 别直接对
df.values调用np.cumsum后塞回 DataFrame——列名和索引可能错位 - 若追求极致性能又需结构,可用
numba.jit加速自定义累积逻辑,但开发成本高,一般没必要
cumsum() 后,务必用 head() 和业务逻辑对照几条记录,比盲目信结果更重要。


















