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

35次阅读

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 参数指定了我们希望作为标识符保留的列,这些列在融化后将保持不变。

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

家作

淘宝推出的家装家居ai创意设计工具

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

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

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 标识符 字符串 数据结构 数据分析 重构

text=ZqhQzanResources