如何利用pandas的melt()方法,实现宽表转长表的操作?
发布于 作者:苏南大叔 来源:程序如此灵动~

在pandas
里面有一个melt()
方法,操作对象是dataframe
。可以把一部分列数据变成横向的行数据。这个列变成行的效果,转换的也并不完全。这个函数的主要功能是把部分列数据变成行数据,也有部分列数据保持不变。同时也会有数据增生的现象发生,原列标签会变成主体内容,同时生成新的列标签。总之,就是和行列互换的需求是完全不同的结果。

大家好,这里是苏南大叔的"程序如此灵动"博客,本文记录pandas
的melt()
方法。测试环境:win10
,python@3.11.0
,numpy@1.24.2
,pandas@1.5.3
。而且这个melt()
函数还有个副作用,就是会增大数据量,作为主键的列数据量会明显成倍增加。
melt
,融化。
melt()
函数原型
frame
:要处理的dataframe
数据。id_vars
:tuple
/list
/ndarray
,用作标识变量的列,即不需要被转换的列名。value_vars
:tuple
/list
/ndarray
,即将被转换的列。 如果未指定,则使未被设置为id_vars
的所有列。var_name
:标量,用于“变量”列的名称。 如果未指定,则使用variable
。value_name
:标量,默认为value
,用于value
列的名称。col_level
:int
或str
,如果列是多重索引的,则使用此级别来融化。这个一般情况下用不到。ignore_index
:默认为True,也就是忽略原有的行名,从头开始计数行名。
原始数据
输出:
默认melt()效果
默认的转换效果,全部的列都被横过来了。新生成
输出:

指定主键id_vars
输出:
输出:
修改新列名
输出:

同时指定id_vars
和value_vars
输出:
值得说明的是:本操作故意丢失了height
数据。
ignore_index,忽略原有行名
不忽略的话,似乎很不妥当。
输出:
多重索引col_index
多重索引的情况,目前还没有涉及过,这里仅仅放个例子,以后待议。
输出:
melt()
对比.T
操作
melt()
作用是宽表变长表,而.T
作用是行列互换。
区分 | 主体.size | 旧列名 | 旧行名 |
---|---|---|---|
melt() | id_vars的数据重复增加 | 旧的变成数据,新列名可指定 | 默认重置,也可以随数据增多而增多 |
.T | 不变 | 变成行名 | 变成列名 |
melt()
之后可能需要的操作
melt()
之后,肉眼可见的标签(行名列名)大混乱。所以,您可能需要下面的操作:
或者:
或者:
参考文章:
结束语
这个melt
可以丢失数据(指定value_vars
),默认增多数据,行名索引也会默认被重置。总之,不是很好用。列转行的操作,仅仅是把部分列数据变成了行,和期待的行列数据互换还有较大差距。


