能否在pandas中结合eval与rolling()使用?三种列赋值方式性能有何差异?
能否通过eval实现滚动窗口原地赋值
不能。pandas的df.eval()方法仅支持解析基础算术运算、列引用、少量内置函数组成的表达式,不支持rolling这类DataFrame方法的链式调用,你示例中的滚动求和逻辑无法直接写在eval的表达式字符串中完成执行,因此没法通过eval实现该需求。如果强行要结合eval实现,也需要先在外层计算好rolling的结果再传入表达式,本质和直接赋值没有区别,完全没有必要。
三种列赋值方式的性能差异
直接赋值 df['some_column_name'] = ...
- 运行速度:三者中最快。属于原地修改操作,没有额外的对象复制开销(2.0及以上版本Pandas若开启Copy-on-Write配置,首次修改会触发一次复制,除此之外无额外开销),适配所有赋值场景,没有语法限制。
- 内存占用:最低。原地修改模式下几乎不会产生额外内存开销,仅会申请新增列本身需要的内存空间。
assign方法 df.assign(new_col=...)
- 运行速度:慢于直接赋值。assign方法默认会生成原DataFrame的完整副本,在副本上完成新列添加后再返回,多了全量数据复制的开销,数据集越大,和直接赋值的速度差距越明显。
- 内存占用:高于直接赋值。执行过程中需要同时存储原DataFrame和新生成的副本,峰值内存占用约为原DataFrame的两倍,副本返回后原对象如果没有其他引用会被垃圾回收,内存会逐步释放。
eval赋值 df.eval('new_col = 表达式', inplace=True)
- 运行速度:性能表现分场景:如果是多列的简单算术运算(比如加减乘除、基础聚合计算),eval底层会调用numexpr做并行优化,避免中间临时对象生成,运算量越大性能优势越明显,甚至会快于直接赋值;如果是复杂逻辑、或者eval不支持的运算,表达式解析的额外开销会让它比直接赋值慢很多,而且很多复杂逻辑本身就不支持用eval实现。
- 内存占用:在支持的运算场景下最低。numexpr会采用分块运算的逻辑,不需要生成完整的中间数组,适合处理内存吃紧的大数据集简单运算。
内容的提问来源于stack exchange,提问作者NMech
相关产品推荐
相关产品推荐

