如何用Pandas高效筛选处理大型CSV文件?解决内存溢出问题
处理大CSV文件的内存友好方案
针对大文件无法全量加载导致的内存溢出问题,下面提供两种高效的落地解决方案:
方法一:Pandas分块读取处理
利用Pandas的chunksize参数将文件拆分成小批量逐块处理,避免一次性占用过多内存:
import pandas as pd # 分块大小,根据自身内存情况调整(比如1万行/块) chunksize = 10000 output_file = 'processed_file.csv' first_write = True # 逐块读取并处理 for chunk in pd.read_csv('large_file.csv', chunksize=chunksize): # 按条件筛选行 filtered_chunk = chunk[(chunk['age'] > 30) & (chunk['salary'] > 50000)] # 新增bonus列 filtered_chunk['bonus'] = 0.1 * filtered_chunk['salary'] # 写入结果文件:第一块写入表头,后续块追加且不重复写表头 filtered_chunk.to_csv( output_file, index=False, mode='w' if first_write else 'a', header=first_write ) first_write = False
注意事项
chunksize的值可灵活调整:内存充足时调大以提升处理效率,内存紧张时调小避免溢出。- 必须控制表头写入逻辑,否则结果文件会重复出现表头行。
方法二:使用Dask处理
Dask是专为大数据设计的并行计算框架,语法和Pandas高度兼容,自动实现分块和并行处理:
import dask.dataframe as dd # 读取大CSV,Dask会自动按内存情况分块 ddf = dd.read_csv('large_file.csv') # 筛选行(语法和Pandas完全一致) filtered_ddf = ddf[(ddf['age'] > 30) & (ddf['salary'] > 50000)] # 新增bonus列 filtered_ddf['bonus'] = 0.1 * filtered_ddf['salary'] # 保存为单个CSV文件,compute()会触发实际计算 filtered_ddf.to_csv('processed_file_dask.csv', index=False, single_file=True)
优势说明
- 无需手动设置分块大小,Dask会根据系统内存自动优化分块策略。
- 支持多核心并行处理,在多核机器上能显著提升处理速度。
single_file=True确保输出为单个CSV文件,若省略则会生成多个分块文件(适合超大规模数据场景)。
内容的提问来源于stack exchange,提问作者Adhidev A S
相关产品推荐
相关产品推荐

