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

因MemoryError寻求pandas apply的替代方案及优化方法

解决Pandas apply处理大数据框时的MemoryError问题

你遇到的问题非常典型:apply在小数据集上表现正常,但面对百万级别的数据就容易触发内存错误,核心原因是apply本质是Python层面的逐行循环,远不如Pandas/Numpy的向量化操作高效。

为什么apply会导致MemoryError?

虽然你以为apply是逐行迭代并丢弃旧值,但实际上它处理每一行时都会创建临时的Series对象,再加上Python循环本身的内存管理效率远低于底层用C实现的向量化操作,当数据量达到250万条时,这些临时对象的内存开销会快速累积,最终触发MemoryError。

更优的向量化实现方案

我们可以用Numpy的np.where或者Pandas的布尔索引来实现完全向量化的逻辑,彻底避免Python循环的开销,不仅内存占用会大幅降低,处理速度也会快很多倍。

方案1:布尔索引分步赋值(逻辑清晰易调试)

import pandas as pd
import numpy as np

# 先复制C列作为mid的初始值
mid = df['C'].copy()
ts = 5

# 处理第一个条件:U=0且D>0
mask1 = (df['U'] == 0) & (df['D'] > 0)
mid[mask1] = df.loc[mask1, 'C'] + ts / 2

# 处理第二个条件:U>0且D=0
mask2 = (df['U'] > 0) & (df['D'] == 0)
mid[mask2] = df.loc[mask2, 'C'] - ts / 2

# 处理else分支中diff=0的情况
diff = df['A'] - df['B']
mask3 = ~mask1 & ~mask2 & (diff == 0)
mid[mask3] = df.loc[mask3, 'C'] + 1

# 将结果赋值回DataFrame(建议先新增列验证结果,再考虑替换原数据)
df['mid'] = mid

方案2:嵌套np.where(紧凑写法)

如果喜欢更简洁的代码,可以用嵌套np.where实现和原函数完全一致的逻辑:

ts = 5
diff = df['A'] - df['B']

mid = np.where(
    (df['U'] == 0) & (df['D'] > 0),
    df['C'] + ts/2,
    np.where(
        (df['U'] > 0) & (df['D'] == 0),
        df['C'] - ts/2,
        np.where(
            diff == 0,
            df['C'] + 1,
            df['C']
        )
    )
)

df['mid'] = mid

效果对比

  • 内存占用:向量化操作直接基于Numpy数组处理,不会产生大量临时Python对象,内存占用比apply低50%以上;
  • 处理速度:向量化操作是C语言层面的批量计算,速度通常是apply的10-100倍,百万级数据几秒就能处理完成。

内容的提问来源于stack exchange,提问作者john

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:53:15