发布于2026-07-08 阅读(0)
扫一扫,手机访问
说起来,Pandas 里 cumsum() 这个函数,看着简单,真用起来的时候,不少人都会在某些细节上“翻车”。比如,默认的累加方向到底是按列还是按行?碰到空值(NaN)怎么办?跟 groupby 组合起来又有什么门道?这些细节如果没搞清楚,跑出来的结果可能跟你预期的差之千里。这篇文章就把这些容易踩坑的地方掰扯清楚。

调用 cumsum() 时,Pandas 默认是沿着索引方向,也就是 axis=0,逐行往下累加的。什么意思?说白了,就是它会对每一列独立地做自己的累计和。这可不是你脑海里可能想象的那种“整张表从左到右”的横向累加,而是每一列在自己内部从上往下累积。
一个经常出现的误解是:不少人以为 df.cumsum() 的效果就像 Excel 里那个“横向拖拽”的累加,结果一看输出,发现每一列的数字好像都在自己跟自己算账,跟预想完全对不上。
所以,有几个关键点必须记住:
axis=1。NaN)是累加的“终结者”。只要当前列里遇到第一个 NaN,那它的累加就中断了,从此以后,这一列后面的所有结果都会是 NaN,不会跳过这个空值继续往下算。cumsum() 会尝试把它们拼接到一起(比如 ['a','b','c'] 会变成 ['a', 'ab', 'abc']),不过在大多数数据分析场景下,这应该不是你想要的。前面提到了,cumsum() 对 NaN 的态度非常强硬——它不是跳过,而是直接“污染”掉后面所有的计算结果。比如,第 3 行某一列是个 NaN,那么从第 3 行开始,这一列往后的所有累加值都会是 NaN,哪怕后面还有有效的数字,它也不认了。
那怎么办呢?一个常见的“偷懒”做法是先用 fillna 填充再算,但这往往会扭曲数据的原始含义。更稳妥的做法,是先把逻辑想清楚:
NaN 代表“这里没有数据,不该参与累计”,那就可以先用 df.mask(df.isna(), 0) 把它替换成 0,然后再去累加。这样操作后,0 不会影响累计结果。NaN 代表的含义是“这个时间点事情没发生,累计应该暂停”,那就干脆保留原样,接受它带来的“截断”效果,这反而更符合逻辑。NaN 和 None 的行为是一样的。但整型列一旦掺入了 NaN,Pandas 会自动把整列的数据类型转换成 float64,这是它内部的类型推断机制,不算 bug,但需要你心里有数。# 一个不够严谨的处理示例,仅作参考 df_filled = df.fillna(0) cumsum_result = df_filled.cumsum()
在分组后使用 cumsum(),比如 df.groupby('category').value.cumsum(),这个操作默认是按照组内的原始数据顺序来累加的,它**既不会重置索引,也不会帮你排序**。这意味着什么?
groupby.cumsum() 返回的是一个 Series,它的索引和原始 DataFrame 是对齐的。所以,你可以直接把它赋值给新的一列,完全不需要再去做一次 merge 操作。agg() 函数里。因为 cumsum 本质上是窗口操作,不是聚合函数。如果你写成 .agg({'value': 'cumsum'}),Pandas 会直接报错,告诉你 Function does not reduce。咱们聊聊性能。如果你用纯 Python 循环自己写一个累加逻辑,那速度跟 cumsum() 比,可能会慢上两到三个数量级。特别是数据行数超过一万行的时候,体感上的卡顿会非常明显。至于 numpy.cumsum(),它在处理单列数据时会比 Pandas 版本快上那么一点点(大约 5% 到 10%),但代价是你失去了 Pandas 提供的索引对齐、数据类型自动处理等一系列便捷功能。
真正影响性能的,往往不是函数本身,而是链式操作中那些不易察觉的隐式拷贝。比如:
df[['A','B']].cumsum().assign(C=lambda x: x.A + x.B) 这样的操作,它会在背后产生多次视图或副本。df.loc[:, ['A', 'B']].cumsum() 来显式切片,这比使用布尔索引要快得多。cumsum(),别图省事对整个 DataFrame 调用。即使你其他列里全是 int8 类型的数据,Pandas 依然会为它们全部分配临时内存,白白消耗资源。还有两个容易被忽略的边界情况:当你的列名里包含了空格或者特殊字符时,像 df.col_name.cumsum() 这种点号引用方式会直接失效,必须改用 df['col name'].cumsum()。另外,cumsum() 函数本身不支持 skipna 参数(不要拿它跟 sum() 函数类比,因为没有这个开关),记牢这一点,能省掉很多排查问题的时间。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8