标签:pandas,melt()方法
有时,我们可能需要将pandas数据框架从宽(wide)格式转换为长(long)格式,这可以通过使用melt方法轻松完成。本文通过一个简单的示例演示如何使用melt方法。
图1
考虑以下示例数据集:一个表,其中包含4个国家前6个月的销售数据。然后,我们的目标是将“宽”格式转换为“长”格式,如上图1所示。
import pandas as pd
import numpy as np
np.random.seed(0)
sales = pd.DataFrame({
'country':['Canada','UK','USA','Australia'],
'Jan':np.random.randint(1,100,size=(4)),
'Feb':np.random.randint(1,1000,size=(4)),
'Mar':np.random.randint(1,1000,size=(4)),
'Apr':np.random.randint(1,1000,size=(4)),
'May':np.random.randint(1,1000,size=(4)),
'Jun':np.random.randint(1,1000,size=(4)),
})
print(sales)
图2
melt()方法语法
pd.melt(dataframe, id_vars=None, value_vars=None, var_name=None, value_name=’value’, col_level=None, ignore_index=True)
其中,
- id_vars:列名的列表/元组。这是为了指定要用作标识符变量的列。
- value_vars:列名的列表/元组。要取消填充的列,留空意味着使用除id_vars之外的所有列。
- var_name:字符串。“variable”列的列名。
- value_name:字符串。”value”列的列名。
将pandas数据框架从宽格式转换为长格式
使用“country”列作为标识符变量id_vars。在第一行代码中,将value_vars留空,实际上是在说:使用除“country”之外的所有列。因此,它相当于下面的第二行代码。
pd.melt(sales, id_vars = 'country')
##下面的代码是等价的
pd.melt(sales, id_vars = 'country', value_vars = ['Jan','Feb','Mar','Apr','May','Jun'])
图3
结果看起来不错。但是,注意到列标题中的一个小问题——“variable”和“value”列的描述性不强。我们想把它们分别改为“Month”和“Sales”。
可以使用df.rename()方法来实现。然而,通过利用melt()方法里的var_name和value_name参数更容易。
pd.melt(sales, id_vars = 'country',var_name='Month',value_name='Sales')
图4
注:本文学习整理自pythoninoffice.com,供有兴趣的朋友学习参考。