Pandas DataFrame宽表重构:使用 melt 转换扁平化嵌套数据

碧海醫心
发布: 2025-09-24 22:11:00
原创
964人浏览过

Pandas DataFrame宽表重构:使用 melt 转换扁平化嵌套数据

本教程将指导如何在Pandas中处理列数过多的宽表,特别是那些由扁平化嵌套JSON生成的数据。我们将利用 melt 函数将宽表转换为更易于管理的长格式,并通过后续的数据清洗和重塑操作,实现将单个实体(如员工)的详细信息从多列展开为多行,从而优化数据结构,提高分析效率。

1. 引言:处理超宽DataFrame的挑战

在数据处理和分析中,我们经常会遇到从复杂数据源(如嵌套的json或xml)扁平化而来的dataframe。这些数据源可能包含重复的结构,例如一个主实体(如公司)下包含多个子实体(如员工),每个子实体又有自己的多个属性。当这些子实体被扁平化到同一行时,就会生成大量的列,例如 employee_0_salary, employee_0_skills_0_id, employee_1_salary 等。当列数超过数百甚至上千时,这种超宽表结构不仅难以管理和理解,还可能在某些操作中遇到性能瓶颈,并且不符合数据分析的规范化要求。

我们的目标是将这些代表不同实例(如不同员工)的详细信息列重构为更简洁、规范的长格式。在这种长格式中,每个子实体的数据将占据一行,共享相同的列名(如 salary, skills_id),同时保留原始的主实体ID信息,使得数据更易于查询、聚合和分析。

2. 核心工具:pandas.melt() 函数

pandas.melt() 函数是Pandas中用于将DataFrame从宽格式转换为长格式的关键工具,也常被称为“unpivot”(逆透视)。它通过指定一个或多个标识符列(id_vars)和要“融化”的列,将其他列名转换为新的 variable 列,并将它们对应的值放入新的 value 列。

2.1 基本用法示例

我们首先创建一个模拟的超宽DataFrame,其结构类似于从扁平化JSON数据中常见的情况:

import pandas as pd
import re # 用于后续的正则表达式操作

# 模拟一个超宽 DataFrame
df = pd.DataFrame({
    'id': [1, 2, 1],
    'name': ['joe','sue', 'fred'],
    'employee_0_salary': [30000, 35000, 40000],
    'employee_0_skills_0_id': [101, 102, 103],
    'employee_0_skills_1_id': [103, 104, 105],
    'employee_1_salary': [32000, 36000, 37000],
    'employee_1_skills_0_id': [105, 106, 107],
    'employee_1_skills_1_id': [108, 109, 110], # 增加一个技能列以展示多技能情况
})

print("原始 DataFrame:")
print(df)
登录后复制

输出:

   id  name  employee_0_salary  employee_0_skills_0_id  \
0   1   joe              30000                     101   
1   2   sue              35000                     102   
2   1  fred              40000                     103   

   employee_0_skills_1_id  employee_1_salary  employee_1_skills_0_id  \
0                     103              32000                     105   
1                     104              36000                     106   
2                     105              37000                     107   

   employee_1_skills_1_id  
0                     108  
1                     109  
2                     110  
登录后复制

现在,我们使用 melt() 将所有员工相关的列进行“融化”。id_vars 参数指定了我们希望作为标识符保留的列,这些列在融化后将保持不变。

即构数智人
即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36
查看详情 即构数智人
meltdf = df.melt(id_vars=['id', 'name'])
print("\n使用 melt() 后的 DataFrame (长格式):")
print(meltdf.head(10)) # 只显示前10行
登录后复制

输出:

   id  name                variable  value
0    1   joe       employee_0_salary  30000
1    2   sue       employee_0_salary  35000
2    1  fred       employee_0_salary  40000
3    1   joe  employee_0_skills_0_id    101
4    2   sue  employee_0_skills_0_id    102
5    1  fred  employee_0_skills_0_id    103
6    1   joe  employee_0_skills_1_id    103
7    2   sue  employee_0_skills_1_id    104
8    1  fred  employee_0_skills_1_id    105
9    1   joe       employee_1_salary  32000
登录后复制

此时,所有原始的员工详细信息列(如 employee_0_salary)都被转换成了 variable 列中的字符串和 value 列中的对应值。id 和 name 列被保留,但由于每个原始行现在对应多个新行,id 和 name 值会出现重复。

3. 从长格式重构为员工实例表

melt() 后的DataFrame虽然是长格式,但 variable 列仍然包含了员工的数字索引(0, 1, ...

以上就是Pandas DataFrame宽表重构:使用 melt 转换扁平化嵌套数据的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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