多表头CSV合并问题:400个文件合并为统一主文件的需求与代码缺陷
解决CSV文件表头不一致的合并问题
原代码的问题
你的现有代码依赖列名完全匹配来合并,但实际场景中存在语义相同但列名不同的字段(比如last-name对应目标name的一部分,add-line1/2/3对应目标address),原代码无法处理这种映射关系,只会把这些字段当成独立列保留,自然达不到预期的合并效果。
解决方案:先标准化字段,再合并
核心思路是先定义字段映射规则,将所有可能的源字段转换为统一的目标字段结构,再合并所有标准化后的文件。
完整实现代码
import glob import pandas as pd # 1. 定义目标列和字段映射规则 TARGET_COLUMNS = ['name', 'phone-no', 'address'] def standardize_csv(df): """将单个CSV的DataFrame转换为目标结构""" standardized = pd.DataFrame(columns=TARGET_COLUMNS) # 处理name字段:如果有last-name,和name拼接;否则直接用name if 'name' in df.columns: if 'last-name' in df.columns: standardized['name'] = df['name'] + ' ' + df['last-name'] else: standardized['name'] = df['name'] else: standardized['name'] = '' # 处理phone-no字段:直接取对应列,无则留空 standardized['phone-no'] = df['phone-no'] if 'phone-no' in df.columns else '' # 处理address字段:优先用address列;否则拼接add-line1/2/3 if 'address' in df.columns: standardized['address'] = df['address'] else: address_parts = [] for part in ['add-line1', 'add-line2', 'add-line3']: if part in df.columns: address_parts.append(df[part].astype(str)) if address_parts: standardized['address'] = '-'.join(address_parts) else: standardized['address'] = '' return standardized # 2. 遍历所有CSV文件,标准化后收集 directory = 'C:/Test' filelist = sorted(glob.glob(directory + '/*.csv')) consolidated_dfs = [] for file in filelist: df = pd.read_csv(file) standardized_df = standardize_csv(df) consolidated_dfs.append(standardized_df) # 3. 合并所有标准化后的DataFrame consolidated = pd.concat(consolidated_dfs, ignore_index=True) # 4. 输出到CSV consolidated.to_csv('C:/<filepath>/consolidated.csv', header=True, index=False)
代码关键说明
- 字段映射函数
standardize_csv:这是核心模块,负责将任意结构的源DataFrame转换为统一的目标结构,处理了各种字段存在/缺失的情况:name:如果源文件有last-name,就和name拼接成全名;否则直接用namephone-no:直接匹配源列,无则留空address:优先用address列;如果没有,就拼接add-line1/2/3(存在的部分),用连字符连接
- 合并逻辑:所有文件都转换为相同结构后,直接用
pd.concat合并即可,无需复杂的merge操作,因为结构完全统一 - 空值处理:这里将缺失的字段设为空字符串,你可以根据需求调整为其他值(比如
NaN)
扩展性
如果后续有其他格式的CSV(比如新增first-name、street等字段),只需要修改standardize_csv函数,新增对应的映射逻辑即可,不需要改动合并流程。
内容的提问来源于stack exchange,提问作者Deva
相关产品推荐
相关产品推荐

