cumsum()需根据数据结构选择用法:series或dataframe列可直接调用,列表或数组需先转换或改用np.cumsum();默认skipna=true但遇nan后全为nan;返回新对象,非就地操作。

直接用 cumsum() 就行,但得先确认数据结构
如果你的数据在 pandas.Series 或 pandas.DataFrame 的某一列里,cumsum() 是最直接的选择;但要是纯 Python 列表或 numpy.ndarray,它不能直接调用——得先转成 Series 或用 np.cumsum()。
-
list:必须先转pd.Series(my_list).cumsum()或np.cumsum(my_list) -
pd.Series:直接s.cumsum(),支持skipna=True/False控制空值处理 -
pd.DataFrame某列:比如df['col'].cumsum(),返回新 Series,原数据不变 - 注意
cumsum()默认按索引顺序累加,不是按值大小排序后累加
cumsum() 遇到 NaN 怎么办
默认 skipna=True,遇到第一个 NaN 后,后续所有结果都是 NaN(因为累计值“断了”)。这不是 bug,是 pandas 的设计逻辑:一旦中间不可算,后续无法恢复。
- 想跳过
NaN继续累加?不行,cumsum()不支持“忽略并继续”模式 - 替代方案:先用
fillna(0)或ffill()预处理,例如df['col'].fillna(0).cumsum() - 若需保留原始
NaN位置但又想计算非空部分的累计和,得用布尔掩码配合np.cumsum()手动实现
和 numpy.cumsum() 有什么实际区别
核心差异在类型安全和空值处理:numpy.cumsum() 对 NaN 更“沉默”,会照常返回 nan,但不会像 pandas 那样把后面全变成 NaN;而 pandas 版本更严格,也更适合带索引的分析场景。
-
np.cumsum([1, np.nan, 3])→array([1., nan, nan]) -
pd.Series([1, np.nan, 3]).cumsum()→0 1.0<br>1 NaN<br>2 NaN
- 性能上,纯数值数组用
np.cumsum()略快;但涉及标签、缺失值策略、链式操作时,Series.cumsum()更省心 - 别混用:传
pd.Series给np.cumsum()会触发隐式转换,可能丢失索引信息
为什么 df['col'].cumsum() 返回的是新对象
因为 cumsum() 是非就地(not-in-place)操作,所有 pandas 的类似方法(sort_values、dropna 等)默认都这样。你得显式赋值才改变原变量。
- 错误写法:
df['col'].cumsum()—— 结果被丢弃 - 正确写法:
df['col_cum'] = df['col'].cumsum()或df.loc[:, 'col_cum'] = df['col'].cumsum() - 如果真要就地修改某列,只能重新赋值:
df['col'] = df['col'].cumsum() - 别指望
inplace=True参数——cumsum()根本不支持这个参数
cumsum()(比如 df.iloc[10:20]['col'].cumsum()),返回的 Series 索引还是原来的整数索引(10–19),不是从 0 开始的新索引。这点在后续拼接或绘图时容易出错。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











