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

Pandas如何映射带空格的XLSX列名至dataclass变量名且不修改原列值

问题描述

现有如下结构的XLSX表格:

First NameLast Name
BillyMadison
HappyGilmore

现有如下定义的Dataclass及初始读取代码:

from dataclasses import dataclass

@dataclass
class Person:
first_name: str
last_name: str


if __name__ == "__main__":
    df = pd.read_excel('people.xlsx', sheet_name='sheet1', skiprows=3, na_values='')
    people = df.values.tolist()
    people_instances = [Person]
    for person in people:
        people_instances.append(Person(*person))

需求:实现带空格的XLSX列名与dataclass下划线风格变量名的映射,无需修改XLSX文件中原有的带空格列名,即可正确将表格数据转换为对应的dataclass实例。

实现方案

核心逻辑是在代码侧完成列名格式转换,不改动源Excel文件,同时避免按位置传参带来的顺序依赖问题:

  • 读取Excel后批量处理DataFrame列名,统一将列名的首尾空格去除、内部空格替换为下划线、转为小写,和dataclass的蛇形命名规则对齐
  • 遍历行数据时转为字典结构,通过关键字传参的方式构造dataclass实例,即使后续Excel列顺序调整也不会出现传参错误
  • 修正原代码中初始列表误写入Person类本身的逻辑错误

修正后的可运行代码:

from dataclasses import dataclass
import pandas as pd

@dataclass
class Person:
    first_name: str
    last_name: str

if __name__ == "__main__":
    df = pd.read_excel('people.xlsx', sheet_name='sheet1', skiprows=3, na_values='')
    # 批量转换列名格式,匹配dataclass字段命名
    df.columns = [col.strip().replace(' ', '_').lower() for col in df.columns]
    # 按关键字传参构造实例,不依赖列的排列顺序
    people_instances = [Person(**row.to_dict()) for _, row in df.iterrows()]

可选扩展

  • 如果存在列名和dataclass字段无法通过规则自动匹配的情况,可以增加自定义映射字典做兜底,例如:
    custom_col_map = {
        "用户 名": "first_name",
        "用户 姓": "last_name"
    }
    df = df.rename(columns=custom_col_map)
    
  • 如果列名包含驼峰、特殊符号等复杂格式,可以引入正则扩展列名转换规则,实现通用蛇形命名转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:27:12