如何在读取Excel到Pandas DataFrame时统一不一致的列名
批量合并多工作表并统一列名解决方案
问题背景
手头有一个包含数百个工作表的Excel文件,各表数据结构一致,但某一目标列(猫咪名称)的表头不统一,存在cats、felines、gatos三种不同命名;同时需要保留列名固定的其他目标列(如date),忽略无关的垃圾列。由于工作表数量多且会新增,列顺序也不固定,无法逐个手动映射列名。
实现思路
- 遍历每个工作表,先读取全部数据
- 识别当前表中属于猫咪列的别名(从固定的别名集合中匹配)
- 筛选出需要保留的列:固定目标列 + 识别到的猫咪列
- 将猫咪列重命名为统一的
cats - 合并所有处理后的工作表
完整代码实现
import pandas as pd # 配置项:根据实际需求修改 CAT_COL_ALIASES = {"cats", "felines", "gatos"} # 猫咪列的所有可能别名 REQUIRED_FIXED_COLS = ["date"] # 必须保留的固定列名 UNIFIED_CAT_COL_NAME = "cats" # 统一后的猫咪列名 # 读取Excel工作簿 excel_file = pd.ExcelFile("Cat_Catalog.xlsx") sheet_names = excel_file.sheet_names # 逐个处理工作表 processed_data = [] for sheet in sheet_names: # 读取当前工作表全部数据 df = pd.read_excel(excel_file, sheet_name=sheet) # 找到当前表中的猫咪列 cat_col = next((col for col in df.columns if col in CAT_COL_ALIASES), None) if not cat_col: continue # 无猫咪列的表直接跳过 # 筛选需要保留的列 selected_cols = REQUIRED_FIXED_COLS + [cat_col] filtered_df = df[selected_cols].copy() # 重命名猫咪列为统一名称 filtered_df.rename(columns={cat_col: UNIFIED_CAT_COL_NAME}, inplace=True) # 可选:添加工作表名称,方便追溯数据来源 filtered_df["source_sheet"] = sheet processed_data.append(filtered_df) # 合并所有处理后的DataFrame final_result = pd.concat(processed_data, ignore_index=True) # 输出结果示例 print(final_result[["cats", "date"]])
代码说明
CAT_COL_ALIASES用集合存储所有可能的猫咪列别名,利用集合的快速查找特性提升效率- 通过
next()函数快速匹配当前表中的猫咪列,避免遍历整个列名列表 - 筛选列后进行重命名,确保所有工作表的猫咪列名称统一
- 可选的
source_sheet列可以帮助你追溯每条数据来自哪个工作表,不需要可直接删除对应代码行 - 自动跳过没有猫咪列的工作表,避免无效数据干扰
扩展场景适配
如果有多个需要统一列名的字段(比如除了猫咪还有狗狗列),可以扩展配置为字典形式:
# 多列别名配置示例 COLUMN_UNIFY_MAP = { "cats": {"cats", "felines", "gatos"}, "dogs": {"dogs", "canines", "perros"} } REQUIRED_FIXED_COLS = ["date"] # 处理逻辑可调整为遍历每个需要统一的字段
内容的提问来源于stack exchange,提问作者JLuu
相关产品推荐
相关产品推荐

