学习Python中的 Pandas melt()

462 阅读7分钟

语法

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)

输出

FNameEID工作年龄
0尹明善100设计师I19
1米加101数据科学家23
2102开发人员21
3硕士103设计师II27
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设计师IEID100
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 列标题的名称。如果Noneframe.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设计师IEID100
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设计师IEID100
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)

输出

每一列的名称与相关数据按其在原始数据结构中出现的顺序连续显示。

变量
0F名称Clare
1姓氏Micah
2女名
3姓氏
4邓丽君
5EID100
6EID101
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 参数是可选的,可以是TrueFalse(布尔值)。

df_ig_index = pd.melt(df, ignore_index=True)
print(df_ig_index)

输出

如果是True,原始索引被忽略。

变量
0F名称克莱尔
1姓氏Micah
2女名
3姓氏
4邓丽君
5EID100
6EID101
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)

输出

如果为假,则保留原始索引。

变量
0F名称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