使用Pandas对百万行DataFrame多列批量执行计算的技术问询
Hey there! 你的代码思路没问题,但用apply(axis=1)逐行处理百万级数据的话,速度会慢到让人崩溃——毕竟apply(axis=1)本质上是在做纯Python循环,完全没用到Pandas基于NumPy的矢量化运算优势。下面给你几个高效的优化方案:
优化百万行DataFrame的列计算方案
方案一:直接矢量化运算(首推,最快)
Pandas的列本身就是NumPy数组,支持直接批量运算,不需要循环或apply:
col_list = ['a', 'b', 'c'] new_col = ['new_a', 'new_b', 'new_c'] # 先计算X的平方,只算一次避免重复计算 x_squared = df['X'] ** 2 # 批量生成新列 for orig_col, new_col_name in zip(col_list, new_col): df[new_col_name] = df[orig_col] / x_squared
这种方式把所有运算交给底层的C级优化代码处理,百万行数据几乎瞬间就能完成计算。
方案二:用df.assign()实现简洁链式调用
如果喜欢更清爽的代码风格,可以用assign一次性生成所有新列:
x_squared = df['X'] ** 2 df = df.assign( new_a=df['a'] / x_squared, new_b=df['b'] / x_squared, new_c=df['c'] / x_squared )
这种写法可读性拉满,而且同样是矢量化运算,效率和方案一几乎没差别。
为什么你的原代码这么慢?
df.apply(axis=1)会逐行遍历整个DataFrame,每一行都要调用一次lambda和你的new函数,这是纯Python级别的循环,开销极大。- 矢量化运算则是把整个列当作一个数组来处理,完全避开了Python循环的额外消耗,速度能提升几十甚至上百倍。
额外注意事项
如果你的X列里有0值,记得提前处理除以0的问题,比如替换成一个极小值(或者根据你的业务逻辑处理):
x_squared = df['X'] ** 2 # 把0替换成1e-10,避免除以0报错 x_squared = x_squared.replace(0, 1e-10)
内容的提问来源于stack exchange,提问作者Alice_inwonderland
相关产品推荐
相关产品推荐

