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

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

  • 24
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
pandas.concat是pandas库中一个用于连接(合并)多个数据框(DataFrame)的函数。它可以沿着指定的轴(默认为行轴)将多个数据框连接在一起,形成一个新的数据框。这个函数可以实现多种连接方式,包括按行或按列连接,连接时可以指定连接方式(内连接、外连接等)以及对缺失值的处理方式。pandas.concat的语法如下: ```python pandas.concat(objs, axis=0, join='outer', ignore_index=False) ``` 其中,objs是要连接的多个数据框(DataFrame)的列表或字典;axis是指定连接的轴,默认为行轴(axis=0);join是指定连接方式,默认为外连接(join='outer');ignore_index是是否忽略原始索引,默认为False。 pandas.join是pandas库中用于按照索引连接多个数据框的方法。它可以根据索引将多个数据框连接在一起,形成一个新的数据框。和pandas.concat不同,pandas.join只能按照索引进行连接,无法指定其他连接方式。pandas.join的语法如下: ```python DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='', sort=False) ``` 其中,DataFrame是要连接的数据框;other是要连接的其他数据框;on是指定连接的列名或列名列表,默认为None使用索引进行连接;how是指定连接方式,默认为左连接(how='left');lsuffix和rsuffix是指定用于重叠列的后缀,默认为空字符串;sort是指定是否根据连接键排序,默认为False。 pandas.merge是pandas库中一个类似于SQL的内连接操作,用于按照列进行连接多个数据框。它可以根据指定的列将多个数据框连接在一起,形成一个新的数据框。pandas.merge的语法如下: ```python pandas.merge(left, right, on=None, how='inner', sort=False) ``` 其中,left和right是要连接的两个数据框;on是指定连接的列名或列名列表,默认为None自动寻找重叠列进行连接;how是指定连接方式,默认为内连接(how='inner');sort是指定是否根据连接键排序,默认为False。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值