值得一看
广告
彩虹云商城
广告

热门广告位

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

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创意设计工具

家作38

查看详情
家作

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, …

相关标签:

js json 正则表达式 工具 数据清洗 性能瓶颈 red json pandas xml 标识符 字符串 数据结构 数据分析 重构

大家都在看:

JS与Python AES解密代码差异:Base64编码错误如何排查?
Python读取JS文件并调用函数时出现编码错误:如何解决UnicodeEncodeError?
Python调用JS函数报错UnicodeEncodeError:如何解决execjs编码问题?
Python和JS MD5加密结果类型差异何在?
JS和Python MD5加密结果不同的原因是什么?
温馨提示: 本文最后更新于2025-09-24 22:32:10,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞6赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容