使用Pandas基于独立列名文件合并多CSV文件的问题
解决CSV文件列缺失合并问题的完整方案
我来帮你搞定这个CSV合并的问题,你的核心需求是用指定的列模板补全每个文件的缺失列后再合并,原来的代码主要有两个问题:一是每次循环都在覆盖merged_data(你每次都把当前文件追加到自己身上,然后直接保存,之前的文件数据都丢了),二是没有处理列不匹配的情况。下面是完整的解决方案:
核心思路
- 提前用模板列初始化一个空的DataFrame,确保合并后的结构统一
- 遍历每个CSV文件时,用
reindex方法将文件的列对齐到模板列,缺失列自动填充默认值(比如NaN或空字符串) - 用
pd.concat高效合并所有对齐后的DataFrame(pandas已不推荐使用append方法)
完整代码实现
import pandas as pd import glob import os def fetch_merge_sheets(input_path, output_path, output_filename, temp_columns): # 初始化空的合并DataFrame,指定模板列 merged_data = pd.DataFrame(columns=temp_columns) # 获取input_path下所有CSV文件(用os.path.join避免路径分隔符问题) input_files = glob.glob(os.path.join(input_path, "*.csv")) for file in input_files: # 跳过列模板文件(如果它在input_path目录下的话) if "列模板文件名.csv" in file: # 替换成你的列模板文件名 continue # 读取当前CSV文件 file_df = pd.read_csv(file) # 对齐到模板列,缺失列填充NaN(可自定义fill_value,比如fill_value="") aligned_df = file_df.reindex(columns=temp_columns, fill_value=pd.NA) # 追加到合并数据中,重置索引避免重复 merged_data = pd.concat([merged_data, aligned_df], ignore_index=True) # 保存合并后的文件 output_full_path = os.path.join(output_path, output_filename) merged_data.to_csv(output_full_path, index=False) # ---------------------- 使用示例 ---------------------- # 1. 读取列模板文件获取列名列表(假设你的列模板文件是一行列名) temp_header_df = pd.read_csv("path/to/你的列模板文件.csv", header=None) temp_columns = temp_header_df.iloc[0].tolist() # 2. 调用合并函数 fetch_merge_sheets( input_path="path/to/你的CSV文件夹", output_path="path/to/输出文件夹", output_filename="合并结果.csv", temp_columns=temp_columns )
关键细节解释
reindex方法:这是处理列不匹配的核心,它会将当前文件的列与模板列对齐,存在的列保留原有数据,缺失的列填充你指定的默认值(默认是NaN)os.path.join:替代手动拼接路径,解决Windows和Linux路径分隔符不一致的问题,避免出现路径错误pd.concat:比append更高效且符合pandas的未来发展方向,ignore_index=True会重置合并后的索引,避免出现重复索引
效果验证
用你给出的示例数据测试:
csv1内容:
col1,col3 A,B
csv2内容:
col1,col2 C,D
csv3内容:
col1,col2 E,F
模板列:['col1','col2','col3']
合并后的CSV内容(填充pd.NA的话,保存后会显示为空):
col1,col2,col3 A,,B C,D, E,F,
内容的提问来源于stack exchange,提问作者Christopher John Reyes
相关产品推荐
相关产品推荐

