文章目录
-
-
-
- 一. 参数含义
- 二. pandas.melt()含义详解
-
- 1. one or more columns are identifier variables (id_vars)
- 3. leaving just two non-identifier columns, ‘variable’ and ‘value’.
- 2. all other columns, considered measured variables (value_vars), are “unpivoted” to the row axis
- 三.举例说明
-
-
方法原型:
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’.
翻译:只留下两个非标识符列,
variable
和value
。
我这里先介绍的第三句话,因为那样更好解释第二句话。
这个意思也就是说:新添加了两个列,一个列名叫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 pdd1 = {
"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 AuthorID 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_name
和value_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 pdd1 = {
"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 AuthorValue
Attribute Name Role
ID
1 Pankaj CEO
2 Lisa Editor
3 David Author
到此,终于从意义到实现已经全部完成。
其中遇到很多不懂的地方,但是还是通过实践才理解了更多。
写的比较糙,希望理解!
如果有哪些地方存在错误,欢迎大家给我留言指出。
如果觉得写的不错,给个赞呗!