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

多表头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拼接成全名;否则直接用name
    • phone-no:直接匹配源列,无则留空
    • address:优先用address列;如果没有,就拼接add-line1/2/3(存在的部分),用连字符连接
  • 合并逻辑:所有文件都转换为相同结构后,直接用pd.concat合并即可,无需复杂的merge操作,因为结构完全统一
  • 空值处理:这里将缺失的字段设为空字符串,你可以根据需求调整为其他值(比如NaN)

扩展性

如果后续有其他格式的CSV(比如新增first-name、street等字段),只需要修改standardize_csv函数,新增对应的映射逻辑即可,不需要改动合并流程。

内容的提问来源于stack exchange,提问作者Deva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:55:24