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

Python中使用Pandas处理大型CSV文件的提速方法咨询

提速方案:用Pandas向量化操作替代逐行循环

你的核心问题是误用了Pandas的迭代方式:iterrows()是逐行遍历,本质是Python层面的循环,速度极慢,完全没发挥Pandas基于C的向量化运算优势。针对你的需求,直接用向量化操作可以把速度提升几个数量级,以下是具体优化步骤:

1. 核心优化:用布尔索引+isin()替代逐行判断

你的逻辑是「检查每行的column_a/column_b是否在目标列表中,若是则收集column_c」,直接用Pandas的内置方法实现,无需循环:

import os
import pandas as pd

desktop = os.path.join(os.environ["USERPROFILE"], "Desktop")
dados = pd.read_csv(os.path.join(desktop, 'test-1000-rows.csv'))

# 假设你的目标列表是这个
target_items = ['item1', 'item2', 'item3']
# 转成集合,提升成员检查速度(尤其当列表很大时)
target_set = set(target_items)

# 生成布尔掩码:column_a或column_b在目标集合中
mask = dados['column_a'].isin(target_set) | dados['column_b'].isin(target_set)
# 直接提取符合条件的column_c,转成列表
result_list = dados.loc[mask, 'column_c'].tolist()

2. 额外提速技巧

(1)优化CSV读取

读取时指定数据类型,避免Pandas自动推断类型的开销,同时减少内存占用:

dados = pd.read_csv(
    os.path.join(desktop, 'test-1000-rows.csv'),
    dtype={'column_a': str, 'column_b': str, 'column_c': str},  # 根据实际类型调整
    low_memory=False  # 避免大文件时的类型推断警告和性能损耗
)

(2)超大数据量:分块读取

如果百万行数据内存放不下,用chunksize分块处理:

result_list = []
chunk_size = 100000  # 每次处理10万行
for chunk in pd.read_csv(os.path.join(desktop, 'large-file.csv'), chunksize=chunk_size):
    mask = chunk['column_a'].isin(target_set) | chunk['column_b'].isin(target_set)
    result_list.extend(chunk.loc[mask, 'column_c'].tolist())

为什么原来的方法慢?

iterrows()会把每行转成Series对象,每次迭代都有Python对象的创建和销毁开销,对于1000行就是1000次对象操作,百万行就是百万次,速度自然指数级下降。而向量化操作是在底层C语言层面批量处理数据,没有Python循环的额外开销,速度能提升几十到几百倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 08:08:13