You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:05:14