Pandas to_csv追加模式合并列不同的大量CSV文件遇列缺失问题
解决CSV流式合并时的列对齐问题
要解决缺失列导致的行错位问题,核心是先收集所有文件的列名,再让每个文件的DataFrame对齐到完整列集合后写入,具体步骤如下:
1. 收集所有出现过的列名
遍历所有文件,仅读取表头(无需加载全量数据),收集所有出现过的列,确保合并后的文件包含所有列:
import pandas as pd from tqdm import tqdm all_columns = set() for f in tqdm(files): # 仅读取表头,避免加载全量数据 with pd.read_csv(f, compression='infer', nrows=0) as df: all_columns.update(df.columns) # 转换为列表,后续用于对齐列 all_columns = list(all_columns)
注:如果你的descomprime函数有特殊的解压/读取逻辑,只需替换成能获取该文件列名的方式即可,比如在descomprime里添加参数控制仅读取表头。
2. 流式写入时对齐列
遍历每个文件,将DataFrame重新索引到完整列集合(缺失列自动填充NaN),再追加写入目标文件:
entidad_csv = folder_entidad / f"{entidad.name.lower()}.csv" file_exists = entidad_csv.exists() for f in tqdm(files): df = descomprime(f) # 对齐到完整列集合,缺失列填充NaN df_aligned = df.reindex(columns=all_columns) # 首次写入时添加表头,后续追加不重复写表头 df_aligned.to_csv( entidad_csv, index=False, mode="a", header=not file_exists ) # 标记文件已存在,避免后续重复写表头 if not file_exists: file_exists = True
关键说明
- 收集列名阶段仅读取表头,内存占用极低,不会触发内存问题;
reindex方法会自动为当前文件缺失的列填充NaN,保证每行的列数与表头一致,避免错位;- 提前标记
file_exists,避免每次写入都判断文件是否存在,提升效率。
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

