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

如何在读取Excel到Pandas DataFrame时统一不一致的列名

批量合并多工作表并统一列名解决方案

问题背景

手头有一个包含数百个工作表的Excel文件,各表数据结构一致,但某一目标列(猫咪名称)的表头不统一,存在cats、felines、gatos三种不同命名;同时需要保留列名固定的其他目标列(如date),忽略无关的垃圾列。由于工作表数量多且会新增,列顺序也不固定,无法逐个手动映射列名。

实现思路

  1. 遍历每个工作表,先读取全部数据
  2. 识别当前表中属于猫咪列的别名(从固定的别名集合中匹配)
  3. 筛选出需要保留的列:固定目标列 + 识别到的猫咪列
  4. 将猫咪列重命名为统一的cats
  5. 合并所有处理后的工作表

完整代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:36:42