cumsum()默认按索引从上到下逐行累加,返回同长Series/DataFrame;单列用df['col'].cumsum(),赋值需显式;分组累计须df.groupby('g')['col'].cumsum(),遇NaN则后续全变为NaN。

用 cumsum() 直接计算单列累计和
最常见需求就是对某数值列做逐行累加,cumsum() 是 Pandas 最直接的解法。它默认按索引顺序从上到下累加,返回同长度的 Series 或 DataFrame。
注意:该方法不修改原数据,需显式赋值或链式调用。
- 若字段名是
"sales",直接写df["sales"].cumsum() - 想把结果存回原表,用
df["sales_cum"] = df["sales"].cumsum() - 对整张表所有数值列批量计算,用
df.select_dtypes(include="number").cumsum()
按分组计算累计和(groupby().cumsum())
遇到带分类维度的数据(比如按 "region" 或 "month" 分组后各自累加),必须先 groupby() 再调用 cumsum(),否则会跨组错误累加。
典型错误是写成 df.groupby("region")["sales"].cumsum() —— 这会报 AttributeError,因为 GroupBy 对象没有 cumsum 方法;正确写法是 df.groupby("region")["sales"].apply(lambda x: x.cumsum()) 或更简洁的 df.groupby("region")["sales"].cumsum()(Pandas 1.0+ 支持直接链式调用)。
- 多级分组也一样:
df.groupby(["region", "product"])["sales"].cumsum() - 分组后想重置索引?加
.reset_index(drop=True),但注意这会丢失原始索引对齐关系
处理缺失值时 cumsum() 的行为
cumsum() 遇到 NaN 会保留并传播:第一个 NaN 后的所有累计值都变成 NaN,不是跳过或填充。这点和 sum() 不同。
- 想跳过
NaN再累加?先用fillna(0),但要小心 0 是否合理(比如销量为 0 和缺失含义不同) - 想前向填充再累加?用
df["sales"].ffill().cumsum(),但需确认业务逻辑是否允许用前值替代缺失 - 检查是否有
NaN:运行df["sales"].isna().any(),别等结果全变NaN才发现
性能与边界情况提醒
累计和本身是 O(n) 操作,通常很快,但两个细节容易被忽略:
- 索引未排序时,
cumsum()仍按当前行序计算——如果数据本应按时间排序却没排,结果就错。必要时先df.sort_values("date", inplace=True) - 在
Series上调用cumsum()返回仍是Series;在DataFrame上调用则对每列分别计算,非数值列会报错,所以建议明确指定列或提前select_dtypes - 如果字段是字符串类型(比如误读为
object),cumsum()会尝试拼接字符串,报TypeError: unsupported operand type(s) for +: 'int' and 'str',先用df["sales"].dtype确认类型
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











