使用Pandas合并文件中的DataFrame:大内存限制下无法采用常规流程的简便方案问询
处理超大CSV文件合并的内存友好方案
绝对有简便的替代方案!当文件大到装不下内存时,硬怼Pandas的常规流程肯定不行,下面几个方案都是我实际用过的,亲测有效:
1. Pandas分块读取+逐块写入(适合纵向行合并)
这是最贴合你原有Pandas习惯的方案,核心思路是每次只加载一小部分数据到内存,处理完就写入输出文件,循环直到所有数据都处理完。
比如要把两个CSV纵向拼接(行合并),代码示例:
import pandas as pd # 调整chunk_size到你的内存能承受的大小,比如10万行 chunk_size = 10**5 # 先处理第一个文件,第一块写入时保留表头,后续块追加 with pd.read_csv('file1.csv', chunksize=chunk_size) as reader: for idx, chunk in enumerate(reader): chunk.to_csv( 'merged_file.csv', mode='w' if idx == 0 else 'a', header=idx == 0, index=False ) # 处理第二个文件,所有块都追加,不写表头 with pd.read_csv('file2.csv', chunksize=chunk_size) as reader: for chunk in reader: chunk.to_csv( 'merged_file.csv', mode='a', header=False, index=False )
这个方案完全不需要修改原有数据的逻辑,只是把一次性加载改成了分批次处理,内存占用会非常低。
2. 用Dask实现并行合并(适合横向列合并或复杂操作)
如果你的需求是横向合并(比如按主键关联),分块处理会很麻烦,这时候可以用Dask——它是专门为大数据设计的库,语法和Pandas几乎一模一样,但会自动在后台分块、并行处理数据,完全不需要你手动管理内存。
示例代码:
import dask.dataframe as dd # 读取两个超大CSV,Dask会自动分块 df1 = dd.read_csv('file1.csv') df2 = dd.read_csv('file2.csv') # 按主键合并,和Pandas的merge用法完全一致 merged_df = dd.merge(df1, df2, on='你的主键列名', how='inner') # how可选left/right/outer/inner # 保存结果,single_file=True确保输出是单个CSV merged_df.to_csv('merged_file.csv', single_file=True, index=False)
Dask的学习成本极低,如果你会用Pandas,几乎不用学就能上手,而且支持各种复杂的DataFrame操作,不止合并。
3. 用命令行工具快速搞定(适合简单场景)
如果你的需求很简单(纯行合并或简单列合并),直接用命令行工具是最快的,完全不占Python内存,几秒就能完成:
纵向行合并
# 先写入第一个文件的表头 head -n 1 file1.csv > merged_file.csv # 追加第一个文件除表头外的所有内容 tail -n +2 file1.csv >> merged_file.csv # 追加第二个文件除表头外的所有内容 tail -n +2 file2.csv >> merged_file.csv
横向列合并(按主键)
先确保安装了csvkit(pip install csvkit),然后:
csvjoin -c 你的主键列名 file1.csv file2.csv > merged_file.csv
这个方案适合不想写代码的场景,处理速度比Python快得多。
内容的提问来源于stack exchange,提问作者Sirdrakeistda
相关产品推荐
相关产品推荐

