
本教程将指导如何在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 pdimport re # 用于后续的正则表达式操作# 模拟一个超宽 DataFramedf = 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 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 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 参数指定了我们希望作为标识符保留的列,这些列在融化后将保持不变。
meltdf = df.melt(id_vars=['id', 'name'])print("n使用 melt() 后的 DataFrame (长格式):")print(meltdf.head(10)) # 只显示前10行
输出:
id name variable value0 1 joe employee_0_salary 300001 2 sue employee_0_salary 350002 1 fred employee_0_salary 400003 1 joe employee_0_skills_0_id 1014 2 sue employee_0_skills_0_id 1025 1 fred employee_0_skills_0_id 1036 1 joe employee_0_skills_1_id 1037 2 sue employee_0_skills_1_id 1048 1 fred employee_0_skills_1_id 1059 1 joe employee_1_salary 32000
此时,所有原始的员工详细信息列(如 employee_0_salary)都被转换成了 variable 列中的字符串和 value 列中的对应值。id 和 name 列被保留,但由于每个原始行现在对应多个新行,id 和 name 值会出现重复。
3. 从长格式重构为员工实例表
melt() 后的DataFrame虽然是长格式,但 variable 列仍然包含了员工的数字索引(0, 1, …
以上就是Pandas DataFrame宽表重构:使用 melt 转换扁平化嵌套数据的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1373513.html
微信扫一扫
支付宝扫一扫