内存有限时,如何用Pandas高效处理大型CSV文件?
处理超大CSV文件的Pandas高效方案
我正在处理一个约10GB的超大CSV文件,无法装入电脑内存。使用pd.read_csv()将其加载到Pandas DataFrame时,出现了MemoryError。
请问不一次性加载整个文件的情况下,用Pandas高效处理该文件的最优方法是什么?我需要执行以下操作:
- 计算某一列的总和
- 根据特定条件筛选行
- 分组并聚合数据
我的代码如下:
import pandas as pd import numpy as np # 生成模拟超大CSV文件 with open('large_file.csv', 'w') as f: for i in range(10000000): # 1000万行 f.write(f'{i},{np.random.rand()},{np.random.randint(0, 10)}\n') # 这行代码会触发MemoryError df = pd.read_csv('large_file.csv', names=['id', 'value', 'category']) # 想要执行的操作示例 # total_value = df['value'].sum() # filtered_df = df[df['category'] > 5] # grouped_df = df.groupby('category')['value'].mean() print("Processing Complete") # 永远执行不到这里
我尝试过在pd.read_csv()中使用chunksize参数,但不确定如何高效地对分块执行所需操作并合并结果。是否有其他技术或库可以考虑?
解决方案
一、使用Pandas的chunksize分块处理
这是Pandas原生的高效方案,通过分块加载文件,逐块处理后合并结果,无需额外依赖。
1. 计算某列总和
逐块累加目标列的数值即可:
import pandas as pd total_value = 0 # 按10万行分块加载,可根据内存调整大小 chunk_iter = pd.read_csv('large_file.csv', names=['id', 'value', 'category'], chunksize=100000) for chunk in chunk_iter: total_value += chunk['value'].sum() print(f"value列总和: {total_value}")
2. 按条件筛选行
逐块筛选符合条件的行,直接写入新CSV避免内存溢出:
import pandas as pd chunk_iter = pd.read_csv('large_file.csv', names=['id', 'value', 'category'], chunksize=100000) # 第一次写入时保留表头 first_chunk = True for chunk in chunk_iter: filtered_chunk = chunk[chunk['category'] > 5] filtered_chunk.to_csv('filtered_large_file.csv', mode='a', header=first_chunk, index=False) first_chunk = False
3. 分组聚合(如按category求value均值)
逐块统计分组的总和与计数,最后计算均值:
import pandas as pd from collections import defaultdict # 存储每个分组的总和与行数 group_stats = defaultdict(lambda: {'sum': 0, 'count': 0}) chunk_iter = pd.read_csv('large_file.csv', names=['id', 'value', 'category'], chunksize=100000) for chunk in chunk_iter: chunk_grouped = chunk.groupby('category')['value'].agg(['sum', 'count']) for cat, stats in chunk_grouped.iterrows(): group_stats[cat]['sum'] += stats['sum'] group_stats[cat]['count'] += stats['count'] # 计算最终均值 grouped_mean = {cat: stats['sum'] / stats['count'] for cat, stats in group_stats.items()} print("按category分组的value均值:") for cat, mean_val in grouped_mean.items(): print(f"category {cat}: {mean_val:.4f}")
二、替代库方案
如果分块处理仍嫌繁琐,可考虑专门处理大数据的工具:
- Dask:API与Pandas高度兼容,自动并行分块处理,支持更大规模数据,语法几乎和Pandas一致,适合无缝迁移。
- Vaex:基于内存映射技术,无需加载全量数据即可操作,支持快速筛选、聚合等操作,适合交互式分析。
- PySpark:适合超大规模分布式处理,若数据量远超单台机器内存,可在分布式集群环境下使用。
内容的提问来源于stack exchange,提问作者user30333135
相关产品推荐
相关产品推荐

