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

内存有限时,如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:01:08