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

如何优化大型pandas DataFrame的join操作及过滤逻辑以降低内存占用?

大体积pandas DataFrame过滤内存不足优化方案

一、pandas原生代码优化

  • 替换原生布尔索引为query()方法:原生布尔索引会生成全量临时布尔数组,同时赋值过程会生成数据副本,触发内存峰值溢出。query()底层基于numexpr做惰性计算,不会生成全量中间数组,内存效率提升50%以上,修改后代码:
df = df.query("NE_STATUS.notna() or NUMERO_CTRC_COMP.notna()")
  • 放弃drop()写法:你尝试的第二种方案需要先生成待删除的行子集作为临时DataFrame,额外占用的内存直接触发溢出,该写法不适用于千万级以上大表场景。
  • 分块加载处理:如果全量加载DataFrame本身就接近内存上限,可在读取数据源阶段就开启分块,逐块过滤后再合并,示例代码(以csv数据源为例,parquet等格式同理):
import pandas as pd

chunk_list = []
# 每块10万行,可根据自身内存大小调整
for chunk in pd.read_csv("你的数据源路径.csv", chunksize=100000):
    filtered_chunk = chunk[(chunk["NE_STATUS"].notna()) | (chunk["NUMERO_CTRC_COMP"].notna())]
    chunk_list.append(filtered_chunk)

# 合并过滤后的块得到最终df
df = pd.concat(chunk_list, ignore_index=True)
  • 提前裁剪冗余列:你当前的df有103列,如果后续业务不需要全部列,可先只保留需要的列再做过滤,能直接降低内存基数:
# 只保留过滤需要的列和后续业务需要的列
df = df[["NE_STATUS", "NUMERO_CTRC_COMP", "其他业务需要的列名"]]
# 再执行过滤操作

二、SQL方案建议

  • 过滤逻辑下沉到业务数据库:如果原始数据存储在MySQL、PostgreSQL等业务库中,不要全量拉取到本地再过滤,直接在SQL侧执行过滤逻辑,只拉取结果集,内存占用可降低90%以上,参考SQL:
SELECT 你需要的列名 FROM 表名 
WHERE NE_STATUS IS NOT NULL OR NUMERO_CTRC_COMP IS NOT NULL
  • 本地文件用嵌入式SQL引擎处理:如果原始数据是本地csv/parquet等文件,没有部署独立数据库,可使用DuckDB直接查询本地文件,不需要全量加载数据到内存,处理千万级表的速度远高于pandas,示例代码:
import duckdb

# 直接查询本地csv文件,过滤后转成pandas df
df = duckdb.query("""
SELECT * FROM '你的本地数据源文件.csv'
WHERE NE_STATUS IS NOT NULL OR NUMERO_CTRC_COMP IS NOT NULL
""").df()

内容的提问来源于stack exchange,提问作者João Galdino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 15:30:02