Pandas如何映射带空格的XLSX列名至dataclass变量名且不修改原列值
问题描述
现有如下结构的XLSX表格:
| First Name | Last Name |
|---|---|
| Billy | Madison |
| Happy | Gilmore |
现有如下定义的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
相关产品推荐
相关产品推荐

