
在数据处理和分析中,我们经常会遇到从复杂数据源(如嵌套的json或xml)扁平化而来的dataframe。这些数据源可能包含重复的结构,例如一个主实体(如公司)下包含多个子实体(如员工),每个子实体又有自己的多个属性。当这些子实体被扁平化到同一行时,就会生成大量的列,例如 employee_0_salary, employee_0_skills_0_id, employee_1_salary 等。当列数超过数百甚至上千时,这种超宽表结构不仅难以管理和理解,还可能在某些操作中遇到性能瓶颈,并且不符合数据分析的规范化要求。
我们的目标是将这些代表不同实例(如不同员工)的详细信息列重构为更简洁、规范的长格式。在这种长格式中,每个子实体的数据将占据一行,共享相同的列名(如 salary, skills_id),同时保留原始的主实体ID信息,使得数据更易于查询、聚合和分析。
pandas.melt() 函数是Pandas中用于将DataFrame从宽格式转换为长格式的关键工具,也常被称为“unpivot”(逆透视)。它通过指定一个或多个标识符列(id_vars)和要“融化”的列,将其他列名转换为新的 variable 列,并将它们对应的值放入新的 value 列。
我们首先创建一个模拟的超宽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 参数指定了我们希望作为标识符保留的列,这些列在融化后将保持不变。
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 值会出现重复。
melt() 后的DataFrame虽然是长格式,但 variable 列仍然包含了员工的数字索引(0, 1, ...
以上就是Pandas DataFrame宽表重构:使用 melt 转换扁平化嵌套数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号