如何用Pandas原生计算替代apply函数?百万级数据性能咨询
问题解答
1. 可以用纯DataFrame矢量化操作重写
原函数的逻辑完全可以通过Pandas/NumPy的矢量化操作实现,彻底替代逐行调用的apply方法,具体代码如下:
import pandas as pd import numpy as np # 计算第一部分的分母 sum_ds_otb = df['ds'] + df['otb_demand'] # 计算第一部分收益:分母为0时直接返回0,否则计算prj_rev/(ds+otb_demand) yield1 = np.where(sum_ds_otb == 0, 0, df['prj_rev'] / sum_ds_otb) # 计算第二部分收益:otb_demand为0时返回0,否则计算otb_rev/otb_demand # 注:原函数未处理此处的除零异常,若需完全对齐原逻辑可去掉该np.where判断 yield2 = np.where(df['otb_demand'] == 0, 0, df['otb_rev'] / df['otb_demand']) # 合并结果:yield1为null时用yield2替代,否则保留yield1 df['prj_yield'] = np.where(pd.isnull(yield1), yield2, yield1)
逻辑对齐说明
这段代码1:1复现了原函数的逻辑:
- 优先计算
prj_rev/(ds + otb_demand),分母为0时直接返回0 - 若上述计算结果为null(比如
prj_rev为空、ds或otb_demand为空导致分母无效),则用otb_rev/otb_demand替代 - 额外补充了原函数未覆盖的
otb_demand为0的异常处理,避免运行时抛出错误,若不需要可自行移除对应逻辑
2. 重写后能大幅优化资源消耗
apply(axis=1)本质是逐行遍历DataFrame,每一行都要生成临时Series对象并调用Python函数,对于100万行的数据来说,这种方式速度极慢,还会产生大量临时对象占用额外内存。
而矢量化操作是Pandas的核心优化特性:
- 所有计算都在底层通过C语言实现批量运算,完全规避Python循环的性能开销
- 直接对整列数组进行操作,无需生成大量临时row对象,内存使用效率更高
- 实际测试中,100万行数据的矢量化计算速度通常是
apply的几十到上百倍
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

