使用Pandas合并列名相似的多个Excel文件的技术疑问
高效合并列名不一致的Excel文件
这个问题太常见了——手动核对重命名确实效率极低,咱们可以通过标准化列名的自动化流程来解决,核心思路是先建立规则把变体列名统一到标准名称,再批量处理。以下是两种实用方案:
方案1:固定映射规则(适合变体可预测的场景)
如果能提前梳理出常见的列名变体(比如复数、大小写、特殊符号替代),直接写一个映射字典,读取文件时自动替换:
import pandas as pd import glob # 第一步:定义列名映射,把所有可能的变体指向标准名称 column_mapping = { 'apples': 'apple', 'orange': 'orange', # 自动处理大小写差异 'sizes': 'size', '#': 'id', # 可以继续添加你遇到的其他变体,比如'apple_'、'id_num'等 } # 第二步:写一个标准化列名的函数 def standardize_columns(df): # 先把所有列名转小写,消除大小写差异 df.columns = [col.lower() for col in df.columns] # 用映射字典替换列名,没有匹配的保留原列名(也可以标记为未知) df.columns = [column_mapping.get(col, col) for col in df.columns] return df # 第三步:批量读取并合并 excel_files = glob.glob('*.xlsx') # 替换成你的文件路径规则 dfs = [] for file in excel_files: df = pd.read_excel(file) df = standardize_columns(df) dfs.append(df) merged_df = pd.concat(dfs, ignore_index=True)
进阶技巧:先收集所有列名变体
如果不确定有多少变体,可以先跑一段代码收集所有出现过的列名,再完善映射字典:
all_columns = set() for file in excel_files: df = pd.read_excel(file) all_columns.update([col.lower() for col in df.columns]) print("所有出现的列名变体:", all_columns)
方案2:模糊匹配(适合变体复杂、不可预测的场景)
如果列名变体很多(比如拼写错误、随意缩写),可以用fuzzywuzzy库做模糊匹配,自动找到最相似的标准列名:
首先安装依赖:
pip install fuzzywuzzy python-Levenshtein
然后编写代码:
import pandas as pd import glob from fuzzywuzzy import process # 定义你期望的标准列名 target_columns = ['apple', 'orange', 'size', 'id'] def fuzzy_standardize_columns(df): df.columns = [col.lower() for col in df.columns] new_columns = [] for col in df.columns: # 匹配最相似的标准列名,返回匹配结果和相似度分数 match, score = process.extractOne(col, target_columns) # 设置相似度阈值(比如80分以上才替换,避免错误匹配) if score >= 80: new_columns.append(match) else: # 不匹配的列可以保留原名称,或者标记为'unknown_' + col new_columns.append(f'unknown_{col}') df.columns = new_columns return df # 批量处理合并 excel_files = glob.glob('*.xlsx') dfs = [fuzzy_standardize_columns(pd.read_excel(file)) for file in excel_files] merged_df = pd.concat(dfs, ignore_index=True)
注意事项
- 模糊匹配的阈值可以根据实际情况调整,比如变体和标准名差异大就调高阈值,反之调低。
- 合并后如果有
unknown_开头的列,说明这些列名没有匹配到标准列,你可以单独处理这些列。
内容的提问来源于stack exchange,提问作者TylerNG
相关产品推荐
相关产品推荐

