语法
pandas.melt(frame,
id_vars=None,
value_vars=None, var_name=None, value_name='value', col_level=None, ignore_index=True)
返回值
melt() 函数的返回值是一个无支点的DataFrame 。
背景介绍
这个函数将一个DataFrame 转换成一种格式,其中一个或多个列是标识符变量(id_vars)。而其他所有的列,被认为是测量变量(value_vars),都是 "无枢轴 "的行轴,只剩下两列非标识符列,'variable' 和'value'!
从本质上讲,如果DataFrame包含有大量数据的众多列,你可以将列限制在一个指定的数量。这样做将把视口从横向改为纵向:这是一个更容易管理的解决方案。
本文将分别深入探讨这个函数的每个参数。
入门
记住,在每个代码段的顶部添加所需的启动代码。这个代码段将使本文中的代码能够无误地运行。
本文中使用的数据结构是一个由键(列名)和相关值(列表)组成的列表 字典 。
必要的启动代码。
import pandas as pd
staff = {'FName': ['Clare', 'Micah', 'Ben', 'Mac', 'Emma'],
'EID': [100, 101, 102, 103, 104],
'Job': ['Designer I', 'Data Scientist', 'Developer', 'Designer II', 'Manager'],
'Age': [19, 23, 21, 27, 36]}
框架 "参数
这个函数的 *frame*参数是一个DataFrame。这个参数有多种格式,几个例子如下
- CSV数据框架
- 列表的字典(本文中使用)
- 图元的字典,以及更多
如果这个参数为空,将显示以下输出。
df = pd.DataFrame()
print(df)
输出
Empty DataFrame
Columns: []
Index: []
如果DataFrame包含参数staff ,输出将类似于下面。格式化会有所不同,取决于运行代码的IDE。
df = pd.DataFrame(staff)
print(df)
输出
| FName | EID | 工作 | 年龄 | |
| 0 | 尹明善 | 100 | 设计师I | 19 |
| 1 | 米加 | 101 | 数据科学家 | 23 |
| 2 | 本 | 102 | 开发人员 | 21 |
| 3 | 硕士 | 103 | 设计师II | 27 |
| 4 | マーマーション | 104 | 经理 | 36 |
id_vars "参数
这个函数的id_vars 参数不是必须的,可能是以下数据类型之一。
这些数据类型传递的是列名。这些名称被用作标识符变量,必须存在于DataFrame中。 数据类型可以包含单个或多个列名。
- 第[3]行将一个有一个元素的列表传递给
id_vars。
df_id_vars = pd.melt(df, id_vars=['Job'])
print(df_id_vars)
输出
在这个例子中,id_vars参数是一个有一个元素的列表,Job.Job元素列显示在索引列的右边.
注意:所有id_var 元素都显示在索引列的右边,其顺序与它们在上述数据类型中出现的顺序相同。
看一下原始数据结构,你会发现Job的原始列位置是三。
staff = {'FName': ['Clare', 'Micah', 'Ben', 'Mac', 'Emma'],
'EID': [100, 101, 102, 103, 104],
'Job': ['Designer I', 'Data Scientist', 'Developer', 'Designer II', 'Manager'],
'Age': [19, 23, 21, 27, 36]}
输出结果显示每个工作人员的Job三次。剩下的每一列都有一次。
- FName
- EID
- 年龄
| 工作 | 变量 | 价值 | |
| 0 | 设计师I | 名称 | 克莱尔 |
| 1 | 数据科学家 | 姓氏 | 米加 |
| 2 | 开发人员 | 冯 | 本 |
| 3 | 二级设计师 | 命名 | 麦 |
| 4 | 经理 | 经理 | 艾玛 |
| 5 | 设计师I | 身份证 | 100 |
| 6 | 数据科学家 | 雇员 | 101 |
| 7 | 开发人员 | 雇员 | 102 |
| 8 | 二级设计师 | 雇员发展部 | 103 |
| 9 | 经理 | 身份证 | 104 |
| 10 | 设计师I | 年龄 | 19 |
| 11 | 数据科学家 | 年龄 | 23 |
| 12 | 开发人员 | 年龄 | 21 |
| 13 | 二级设计师 | 年龄 | 27 |
| 14 | 经理 | 年龄 | 36 |
value_vars参数
这个函数的value_vars 参数不是必须的,可能是以下数据类型之一。
- 元组
- 列表
- ndarray
这个参数将列设置为unpivot。如果不输入,所有的列都会显示(除了分配为 id_vars).
df_val_vars = pd.melt(df, id_vars=['Job'], value_vars=['EID', 'Age'])
print(df_val_vars)
输出
工作列表仍然设置为id_vars (见上文)。
每个工作人员的工作被显示两次。value_vars 参数中列出的每一列都显示一次。
- EID
- 年龄
| 工作 | 变量 | 价值 | |
| 0 | 设计师I | EID | 100 |
| 1 | 数据科学家 | 雇员 | 101 |
| 2 | 开发人员 | 雇员 | 102 |
| 3 | 设计师II | 雇员 | 103 |
| 4 | 经理 | 身份证 | 104 |
| 5 | 设计师I | 年龄 | 19 |
| 6 | 数据科学家 | 年龄 | 23 |
| 7 | 开发人员 | 年龄 | 21 |
| 8 | 二级设计师 | 年龄 | 27 |
| 9 | 经理 | 年龄 | 36 |
var_name参数
这个函数的var_name ,不是必须的,是标量的。这个名称是用于variable 列标题的名称。如果None ,frame.columns.name ,或者variable 这个词将显示。
df_var_name = pd.melt(df, id_vars=['Job'], value_vars=['EID', 'Age'])
print(df_var_name)
输出
在运行下面的代码之前,var_name 列被称为variable 。

df_var_name = pd.melt(df, id_vars=['Job'], value_vars=['EID', 'Age'], var_name='EID/Age')
print(df_var_name)
输出
运行此代码后,var_name 列现在被称为EID/年龄。
| 工作 | EID/Age | 值 | |
| 0 | 设计师I | EID | 100 |
| 1 | 数据科学家 | 雇员 | 101 |
| 2 | 开发人员 | 雇员 | 102 |
| 3 | 设计师II | 雇员 | 103 |
| 4 | 经理 | 身份证 | 104 |
| 5 | 设计师I | 年龄 | 19 |
| 6 | 数据科学家 | 年龄 | 23 |
| 7 | 开发人员 | 年龄 | 21 |
| 8 | 二级设计师 | 年龄 | 27 |
| 9 | 经理 | 年龄 | 36 |
value_name参数
这个函数的value_name 参数不是必须的,是标量的。这个名称是用于value 列标题的名称。如果None ,则使用 value 。
df_var_name = pd.melt(df, id_vars=['Job'], value_vars=['EID', 'Age'])
print(df_var_name)
输出
在运行此代码之前,value_name 列的名称被称为value 。

df_val_name = pd.melt(df, id_vars=['Job'], value_vars=['EID', 'Age'],
var_name='EID/Age', value_name='Data')
print(df_val_name)
输出
运行此代码后,value_name 列现在被称为Data 。
| 工作 | EID/年龄 | 数据 | |
| 0 | 设计师I | EID | 100 |
| 1 | 数据科学家 | 雇员 | 101 |
| 2 | 开发人员 | 雇员 | 102 |
| 3 | 设计师II | 雇员 | 103 |
| 4 | 经理 | 身份证 | 104 |
| 5 | 设计师I | 年龄 | 19 |
| 6 | 数据科学家 | 年龄 | 23 |
| 7 | 开发人员 | 年龄 | 21 |
| 8 | 二级设计师 | 年龄 | 27 |
| 9 | 经理 | 年龄 | 36 |
col_level参数
这个函数的col_level 参数不是必须的,可以是一个整数或字符串数据类型。如果列是多指标的,用这个级别来融化。
df_col_level = df.melt(col_level=0)
print (df_col_level)
输出
每一列的名称与相关数据按其在原始数据结构中出现的顺序连续显示。
| 变量 | 值 | |
| 0 | F名称 | Clare |
| 1 | 姓氏 | Micah |
| 2 | 女名 | 本 |
| 3 | 姓氏 | 麦 |
| 4 | 名 | 邓丽君 |
| 5 | EID | 100 |
| 6 | EID | 101 |
| 7 | 身份证 | 102 |
| 8 | 身份证 | 103 |
| 9 | 身份证 | 104 |
| 10 | 工作 | 设计师 I |
| 11 | 职务 | 数据科学家 |
| 12 | 职务 | 开发人员 |
| 13 | 职务 | 二级设计师 |
| 14 | 职务 | 经理 |
| 15 | 年龄 | 19 |
| 16 | 年龄 | 23 |
| 17 | 年龄 | 21 |
| 18 | 年龄 | 27 |
| 19 | 年龄 | 36 |
ignore_index参数
ignore_index 参数是可选的,可以是True或False(布尔值)。
df_ig_index = pd.melt(df, ignore_index=True)
print(df_ig_index)
输出
如果是True,原始索引被忽略。
| 变量 | 值 | |
| 0 | F名称 | 克莱尔 |
| 1 | 姓氏 | Micah |
| 2 | 女名 | 本 |
| 3 | 姓氏 | 麦 |
| 4 | 名 | 邓丽君 |
| 5 | EID | 100 |
| 6 | EID | 101 |
| 7 | 身份证 | 102 |
| 8 | 身份证 | 103 |
| 9 | 身份证 | 104 |
| 10 | 工作 | 设计师 I |
| 11 | 职务 | 数据科学家 |
| 12 | 职务 | 开发人员 |
| 13 | 职务 | 二级设计师 |
| 14 | 职务 | 经理 |
| 15 | 年龄 | 19 |
| 16 | 年龄 | 23 |
| 17 | 年龄 | 21 |
| 18 | 年龄 | 27 |
| 19 | 年龄 | 36 |
df_ig_index = pd.melt(df, ignore_index=False)
print(df_ig_index)
输出
如果为假,则保留原始索引。
| 变量 | 值 | |
| 0 | F名称 | Clare |
| 1 | 姓氏 | Micah |
| 2 | 女名 | 本 |
| 3 | 姓氏 | 麦 |
| 4 | 名 | 硕士 |
| 0 | 身份证 | 100 |
| 1 | 身份证 | 101 |
| 2 | 身份证 | 102 |
| 3 | 身份证 | 103 |
| 4 | 身份证 | 104 |
| 0 | 工作 | 设计师 I |
| 1 | 职务 | 数据科学家 |
| 2 | 职务 | 开发人员 |
| 3 | 职务 | 二级设计师 |
| 4 | 职务 | 经理 |
| 0 | 年龄 | 19 |
| 1 | 年龄 | 23 |
| 2 | 年龄 | 21 |
| 3 | 年龄 | 27 |
| 4 | 年龄 | 36 |