0

0

Pandas中高效处理宽表结构的教育经历数据:从宽表到长表的规范化重构

霞舞

霞舞

发布时间:2026-03-14 15:48:13

|

417人浏览过

|

来源于php中文网

原创

本文介绍如何使用pandas的melt()将包含多组重复字段(如degree1/2/3、specialisation1/2/3等)的宽表Excel数据,规范化为每行一条教育经历的长表结构,从而简化后续迭代、校验与Selenium自动化流程。

本文介绍如何使用pandas的`melt()`将包含多组重复字段(如degree1/2/3、specialisation1/2/3等)的宽表excel数据,规范化为每行一条教育经历的长表结构,从而简化后续迭代、校验与selenium自动化流程。

在处理招聘或HR类Excel数据时,常遇到“宽表设计”问题:同一候选人(一行记录)的多个教育背景被横向展开为degree1、specialisation1、college1、degree2、specialisation2……直至degree5等列。这种结构虽便于人工阅读,却严重阻碍程序化处理——直接使用df.iterrows()无法自然遍历每位候选人的全部教育项,导致逻辑臃肿、易出错(如原问题中尝试的复杂索引分组函数)。

理想方案是数据重塑(Reshaping):将宽表转换为标准长表(tidy data),即每行唯一标识一位候选人的一条教育经历。pandas 提供了简洁高效的 pd.melt() 方法实现这一目标。

✅ 正确做法:用 melt() 实现规范化长表

假设已通过 pd.read_excel() 加载数据:

import pandas as pd

df = pd.read_excel("applicants.xlsx")

观察原始列名,识别两类字段:

  • 标识变量(id_vars):描述候选人本身的列,如 'sr_no', 'name', 'mobile', 'emp_status' 等;
  • 度量变量(value_vars):需展开的教育相关列,如所有以 degree, specialisation, college 开头的列(共 3 类 × 最多 5 组 = 15 列)。

我们无需手动枚举全部15列——可动态提取:

PixVerse
PixVerse

PixVerse是一款强大的AI视频生成工具,可以轻松地将多种输入转化为令人惊叹的视频。

下载
# 定义不变的标识列
id_cols = ['sr_no', 'old_emp_id', 'name', 'address', 'mobile', 'emp_status']

# 自动筛选所有教育相关列(含 degreeX / specialisationX / collegeX)
edu_cols = [col for col in df.columns 
            if col.startswith(('degree', 'specialisation', 'college'))]

# 执行熔解(melt):将教育列“折叠”为两列 —— attribute(字段名)和 value(值)
df_long = pd.melt(
    df,
    id_vars=id_cols,
    value_vars=edu_cols,
    var_name='attribute',
    value_name='value'
)

此时 df_long 结构如下(节选):

sr_no name mobile emp_status attribute value
1 Amit 356363474 full-time degree1 Computer Science
1 Amit 356363474 full-time specialisation1 Robotics
1 Amit 356363474 full-time college1 IIT Delhi
1 Amit 356363474 full-time degree2 MSC ML
1 Amit 356363474 full-time specialisation2 MIT
... ... ... ... ... ...

✅ 优势立现:每位候选人对应多行,每行含完整身份信息 + 单一教育属性,可直接按 sr_no 分组后批量处理:

# 按候选人分组,聚合其全部教育记录
for sr_no, group in df_long.groupby('sr_no'):
    candidate_name = group['name'].iloc[0]
    print(f"\n✅ 处理候选人 {candidate_name}(ID: {sr_no}):")

    # 提取该候选人的所有教育条目(每3行一组:degree/specialisation/college)
    edu_records = []
    for _, row in group.iterrows():
        attr, val = row['attribute'], row['value']
        if pd.isna(val): continue  # 跳过空值

        # 解析字段编号(如 degree1 → 1, college3 → 3)
        import re
        match = re.search(r'(\d+)$', attr)
        if not match: continue
        idx = int(match.group(1))

        # 动态构建字典(支持 degreeX / specialisationX / collegeX)
        key = attr.replace(str(idx), '')  # 如 'degree1' → 'degree'
        if len(edu_records) < idx:
            edu_records.append({})
        edu_records[idx-1][key] = val

    # 输出标准化教育列表(每项含 degree, specialisation, college)
    for i, edu in enumerate(edu_records, 1):
        print(f"  ? 教育{i}: {edu.get('degree', 'N/A')} | "
              f"{edu.get('specialisation', 'N/A')} | "
              f"{edu.get('college', 'N/A')}")

⚠️ 注意事项与最佳实践

  • 避免 iterrows() 嵌套循环处理宽表:原问题中自定义函数依赖硬编码索引与除法运算,极易因列顺序变化或缺失字段崩溃;melt() 是声明式、健壮且可读性高的替代方案。
  • 字段命名一致性至关重要:确保所有教育列严格遵循 degree1/specialisation1/college1 等命名模式,否则正则解析会失效。建议在数据导入后添加校验:
    assert all(re.match(r'(degree|specialisation|college)\d+$', c) for c in edu_cols), "教育字段命名不规范"
  • 空值与截断处理:实际数据中常存在 degree3 有值但 specialisation3 为空的情况。melt() 保留原始空值,后续聚合时应显式跳过 pd.isna(),避免填充错误。
  • 性能提示:对于超大数据集(>10万行),可先 df[edu_cols] = df[edu_cols].fillna("") 再 melt(),减少 pd.NA 开销;必要时改用 pd.wide_to_long()(需列名满足严格格式,如 degree_1, degree_2)。

✅ 总结

将宽表教育数据通过 pd.melt() 重构为长表,是面向自动化流程(如 Selenium 表单填写)的关键预处理步骤。它消除了手工索引计算的脆弱性,使代码逻辑回归“一人一行教育经历”的自然语义,大幅提升可维护性与扩展性。掌握 melt()、wide_to_long() 及 pivot() 等重塑工具,是 Pandas 高阶数据清洗的核心能力。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

81

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

34

2026.01.31

PHP 命令行脚本与自动化任务开发
PHP 命令行脚本与自动化任务开发

本专题系统讲解 PHP 在命令行环境(CLI)下的开发与应用,内容涵盖 PHP CLI 基础、参数解析、文件与目录操作、日志输出、异常处理,以及与 Linux 定时任务(Cron)的结合使用。通过实战示例,帮助开发者掌握使用 PHP 构建 自动化脚本、批处理工具与后台任务程序 的能力。

67

2025.12.13

excel对比两列数据异同
excel对比两列数据异同

Excel作为数据的小型载体,在日常工作中经常会遇到需要核对两列数据的情况,本专题为大家提供excel对比两列数据异同相关的文章,大家可以免费体验。

1455

2023.07.25

excel重复项筛选标色
excel重复项筛选标色

excel的重复项筛选标色功能使我们能够快速找到和处理数据中的重复值。本专题为大家提供excel重复项筛选标色的相关的文章、下载、课程内容,供大家免费下载体验。

428

2023.07.31

excel复制表格怎么复制出来和原来一样大
excel复制表格怎么复制出来和原来一样大

本专题为大家带来excel复制表格怎么复制出来和原来一样大相关文章,帮助大家解决问题。

573

2023.08.02

excel表格斜线一分为二
excel表格斜线一分为二

在Excel表格中,我们可以使用斜线将单元格一分为二。本专题为大家带来excel表格斜线一分为二怎么弄的相关文章,希望可以帮到大家。

1264

2023.08.02

excel斜线表头一分为二
excel斜线表头一分为二

excel斜线表头一分为二的方法有使用合并单元格功能方法、使用文本框功能方法、使用自定义格式方法。本专题为大家提供excel斜线表头一分为二相关的各种文章、以及下载和课程。

376

2023.08.02

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号