pandas.melt()详解

方法原型:

pandas.melt(dataframe,
                   id_vars=None, value_vars=None,
                   var_name=None,value_name=‘value’,
                   col_level=None)

一. 参数含义

  • frame : 就是指我们要操作的DataFrame;
  • id_vars : 就是我们自行指定哪些列作为identifier variables
    • 可以为tuple, list, or ndarray, optional Column(s)等
  • value_vars:指定哪些列被unprivot,我觉得就是把列转化为一行一行的键值对
    • 可以为tuple, list, or ndarray, optional Column(s)等
  • var_name:给varivale那一列的别名。如果没指定或者为None,那么则默认为frame.columns.name 或者varivale
  • value_name:给value那一列的别名。默认为value
  • col_level

二. pandas.melt()含义详解

官方指出:Unpivots可以理解为与"pivots"的操作恰恰相反,也就是两种操作互逆。
翻译过来就是说:

将数据流从宽格式转换为长格式,可选择地保留设置的标识符变量。

尴尬,我还是看不太明白啥意思!!!

该函数,可以将一个DataFrame转换为一种格式,什么格式呢?

我剖析了一下官方文档,分为了三句概要,我将一句一句来理解:

This function is useful to massage a DataFrame into a format where one or more columns are identifier variables (id_vars), while all other columns, considered measured variables (value_vars), are “unpivoted” to the row axis, leaving just two non-identifier columns, ‘variable’ and ‘value’.

1. one or more columns are identifier variables (id_vars)

先假设传入的id_vars = [‘xxx’, ‘…’],有一列或多列

翻译:将一列或者多列作为标识符(id_vars)。

我觉得类似groupby一样,就是把id_vars参数中的列名作为index放在第一列(如果list中有多个列,那么则还有第二列…)

还不懂没关系,后面都会举例。


3. leaving just two non-identifier columns, ‘variable’ and ‘value’.

翻译:只留下两个非标识符列,variablevalue

我这里先介绍的第三句话,因为那样更好解释第二句话。

这个意思也就是说:新添加了两个列,一个列名叫variable,另一个叫value.

那么这两列是干什么的呢?别急,看下面的第二句话解释。



2. all other columns, considered measured variables (value_vars), are “unpivoted” to the row axis

翻译:所有其他的列,被作为被测量的变量(id_vars),都不以行轴为轴。

抱歉,说得这么复杂我表示看不懂!!!…

我就从简单来讲,就是把其余的列的所有值全部按照<列名 —— 值>的方式,一行一行的纵向堆起来 的特殊格式.
怎么存放每一个<列名 —— 值>的呢?

列名放在之前提到的variable列的第一行
对应的值放在之前提到的value列的第一行;

那么下一个就是同样的操作:
列名放在之前提到的variable列的第二行
对应的值放在之前提到的value列的第二行;
… …

讲了这么多,我觉得还是先讲一下咱们的函数的参数含义,然后通过举例子进行理解吧!

三.举例说明

举例来查看该函数的功能,肯定更好理解。
1. Pandas melt() 简单实例

import pandas as pd

d1 = {"Name": ["Pankaj", "Lisa", "David"], "ID": [1, 2, 3], "Role": ["CEO", "Editor", "Author"]}

df = pd.DataFrame(d1)

print(df)

df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"])

print(df_melted)

输出:


     Name  ID    Role
0  Pankaj   1     CEO
1    Lisa   2  Editor
2   David   3  Author

   ID variable   value
0   1      Name  Pankaj
1   2      Name    Lisa
2   3      Name   David
3   1      Role     CEO
4   2      Role  Editor
5   3      Role  Author

当然我们可以设置var_namevalue_name修改‘variable’ 和‘value’这两列的名字.


df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"], var_name="Attribute", value_name="Value")

2. id_vars传入多列

一次传入多列作为id_vars的形参.


df_melted = pd.melt(df, id_vars=["ID", "Name"], value_vars=["Role"])
print(df_melted)

输出:

   ID    Name variable   value
0   1  Pankaj     Role     CEO
1   2    Lisa     Role  Editor
2   3   David     Role  Author

3. 甚至还可以跳过某些列,进行melt()
不需要使用原DataFrame中的所有行,在下面的示例中跳过ID列。

df_melted = pd.melt(df, id_vars=["Name"], value_vars=["Role"])
print(df_melted)

输出:

     Name variable   value
0  Pankaj     Role     CEO
1    Lisa     Role  Editor
2   David     Role  Author

4. 使用pivot() 进行解除melt()操作
我们可以使用pivot()函数来解压缩一个DataFrame对象并获得原始的DataFrame.pivot()函数的索引参数值应该与id_vars值相同。'columns’值应该是variable对应的名字作为参数传入.


import pandas as pd

d1 = {"Name": ["Pankaj", "Lisa", "David"], "ID": [1, 2, 3], "Role": ["CEO", "Editor", "Author"]}

df = pd.DataFrame(d1)

# print(df)

df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"], var_name="Attribute", value_name="Value")

print(df_melted)

# unmelting using pivot()

df_unmelted = df_melted.pivot(index='ID', columns='Attribute')

print(df_unmelted)


   ID Attribute   Value
0   1      Name  Pankaj
1   2      Name    Lisa
2   3      Name   David
3   1      Role     CEO
4   2      Role  Editor
5   3      Role  Author

            Value        
Attribute    Name    Role
ID                       
1          Pankaj     CEO
2            Lisa  Editor
3           David  Author

到此,终于从意义到实现已经全部完成。
其中遇到很多不懂的地方,但是还是通过实践才理解了更多。
写的比较糙,希望理解!
如果有哪些地方存在错误,欢迎大家给我留言指出。
如果觉得写的不错,给个赞呗!

发布了29 篇原创文章 · 获赞 46 · 访问量 8199

猜你喜欢

转载自blog.csdn.net/qq_37344125/article/details/104137113