为何DataFrame.cumsum支持列表/字符串,GroupBy.cumsum却不支持?
GroupBy.cumsum 无法处理列表/字符串列的原因
先给出测试用的DataFrame定义:
import pandas as pd df = pd.DataFrame({ "group": [1, 1, 2, 2, 2], "list": [[1], [2], [1], [2], [3]], "string": ["a", "b", "a", "b", "c"] })
单独调用df.cumsum()可以正常执行,结果如下:
group list string 0 1 [1] a 1 2 [1, 2] ab 2 4 [1, 2, 1] aba 3 6 [1, 2, 1, 2] abab 4 8 [1, 2, 1, 2, 3] ababc
但执行df.groupby("group").cumsum()时会返回空DataFrame,同时抛出FutureWarning:
Empty DataFrame Columns: [] Index: [0, 1, 2, 3, 4]
核心原因:
- 两类cumsum的实现逻辑差异:
DataFrame.cumsum是逐列独立处理,对于字符串、列表这类非数值类型,它并没有依赖numpy.cumsum(numpy本身不支持列表的累加),而是利用Python原生的+运算符特性,单独实现了字符串拼接、列表元素追加的累加逻辑。 - GroupBy.cumsum的设计定位:
GroupBy.cumsum的Cython化实现是专门针对数值类型做性能优化的,它在执行时会自动筛选出数值型列进行计算,直接排除字符串、列表这类object类型列——因为分组累加的核心应用场景是数值累计求和,pandas的GroupBy系列方法在设计时就优先保障数值类型的处理效率,对非数值类型的支持被刻意限制。 - 空DataFrame与警告的由来:
当前版本的pandas已经默认跳过非数值列的处理,所以返回空DataFrame;FutureWarning则是明确提示,未来版本会彻底移除对非数值列的尝试性处理逻辑。
内容的提问来源于stack exchange,提问作者Timus
相关产品推荐
相关产品推荐

