pandas.DataFrame.melt()
是一个非常实用的函数,可以用于转换数据集的格式。它可以将 dataframe 的列转换成行,将宽表格(wide format)转换为长表格(long format),从而方便进行数据分析。在本篇攻略中,我们将详细解释 melt 函数的作用和使用方法,并提供至少两个实例进行说明。
什么是宽表格和长表格
在对 pandas.DataFrame.melt()
进行介绍之前,首先需要了解宽表格和长表格的概念。
宽表格通常指一个 dataframe 中有多个列,每个列对应一个特征,与其他列相互独立;而长表格通常指一个 dataframe 中只有两列,其中一列是特征名称,另一列是该特征下的数值。例如,下面这张表格就是一个宽表格:
Name | Age | Sex | Height | Weight | |
---|---|---|---|---|---|
0 | John | 23 | M | 185 | 75 |
1 | Jane | 28 | F | 170 | 60 |
2 | Alex | 35 | M | 178 | 80 |
转换为长表格后,变成了以下形式:
Name | Variable | Value | |
---|---|---|---|
0 | John | Age | 23 |
1 | Jane | Age | 28 |
2 | Alex | Age | 35 |
3 | John | Sex | M |
4 | Jane | Sex | F |
5 | Alex | Sex | M |
6 | John | Height | 185 |
7 | Jane | Height | 170 |
8 | Alex | Height | 178 |
9 | John | Weight | 75 |
10 | Jane | Weight | 60 |
11 | Alex | Weight | 80 |
从上面的表格可以看出,转换为长表格后,变成了每个样本对应多行,且特征和数值都出现在了同一列。
pandas.DataFrame.melt() 的作用
pandas.DataFrame.melt()
可以将宽表格转换为长表格,其主要参数如下:
pandas.DataFrame.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', ... )
其中各参数的含义如下:
- id_vars:需要保留的列名(变量名或宽表格的行标识符)的列表或数值。这些列会被转换为长表格中的行。
- value_vars:需要转换为长表格中的变量的列名的列表或数值。如果忽略该参数,则使用除 id_vars 以外的所有列。
- var_name:表示转换后的变量列的列名,默认为 ‘variable’。
- value_name:表示转换后的数值列的列名,默认为 ‘value’。
- …:其他参数,如转换后的行的名称、数据类型等。
使用方法
接下来我们将通过两个实例来具体讲解 pandas.DataFrame.melt()
的使用方法。
实例一:无需指定 value_vars,转换整张表格
下面是一个宽表格 df
:
import pandas as pd
df = pd.DataFrame({
'City': ['Beijing', 'Shanghai', 'Guangzhou'],
'2017': [20, 28, 10],
'2018': [17, 34, 12],
'2019': [23, 29, 14]
})
print(df)
# Output:
# City 2017 2018 2019
# 0 Beijing 20 17 23
# 1 Shanghai 28 34 29
# 2 Guangzhou 10 12 14
现在我们使用 pandas.DataFrame.melt()
将其转换为长表格:
df_long = df.melt(id_vars=['City'], var_name='Year', value_name='Amount')
print(df_long)
# Output:
# City Year Amount
# 0 Beijing 2017 20
# 1 Shanghai 2017 28
# 2 Guangzhou 2017 10
# 3 Beijing 2018 17
# 4 Shanghai 2018 34
# 5 Guangzhou 2018 12
# 6 Beijing 2019 23
# 7 Shanghai 2019 29
# 8 Guangzhou 2019 14
在上面的例子中,我们没有手动指定需要转换的列,因此将默认对除了 'City'
以外的所有列执行转换。我们指定 id_vars=['City']
,它们保留为新表格的行,var_name='Year'
指定新表格中变量列的名称为 'Year'
,将转换后的数值列的名称设置为 'Amount'
。
实例二:指定 value_vars,转换部分列
下面是一个镜像图和其对应的 RGB 信息的宽表格。其中变量列为 'Color'
,数值列为 'Left'
和 'Right'
。
df_mirror = pd.DataFrame({
'Color': ['Red', 'Green', 'Blue'],
'Left_R': [125, 232, 9],
'Left_G': [68, 90, 100],
'Left_B': [200, 145, 0],
'Right_R': [200, 12, 20],
'Right_G': [140, 190, 0],
'Right_B': [78, 255, 200]
})
print(df_mirror)
# Output:
# Color Left_R Left_G Left_B Right_R Right_G Right_B
# 0 Red 125 68 200 200 140 78
# 1 Green 232 90 145 12 190 255
# 2 Blue 9 100 0 20 0 200
现在我们想要将左右两个颜色通道的数值转换为新表格的一列,并将它们重命名为 'Value'
。我们只需要指定 value_vars
参数为需要转换的列名列表即可。
df_mirror_long = df_mirror.melt(id_vars=['Color'],
value_vars=['Left_R', 'Left_G', 'Left_B', 'Right_R', 'Right_G', 'Right_B'],
var_name='Channel',
value_name='Value')
print(df_mirror_long)
# Output:
# Color Channel Value
# 0 Red Left_R 125
# 1 Green Left_R 232
# 2 Blue Left_R 9
# 3 Red Left_G 68
# 4 Green Left_G 90
# 5 Blue Left_G 100
# 6 Red Left_B 200
# 7 Green Left_B 145
# 8 Blue Left_B 0
# 9 Red Right_R 200
# 10 Green Right_R 12
# 11 Blue Right_R 20
# 12 Red Right_G 140
# 13 Green Right_G 190
# 14 Blue Right_G 0
# 15 Red Right_B 78
# 16 Green Right_B 255
# 17 Blue Right_B 200
我们指定 value_vars=['Left_R', 'Left_G', 'Left_B', 'Right_R', 'Right_G', 'Right_B']
,将长表格中的变量设置为左右两个颜色通道的数值。同时,指定 var_name='Channel'
和 value_name='Value'
,将转换后的变量列命名为 'Channel'
,将转换后的数值列命名为 'Value'
。
总结
pandas.DataFrame.melt()
函数可以将宽表格转换为易于分析的长表格,便于进行数据分析和可视化。它的使用方法主要是根据需要指定需要保留的列和需要转换的列,并设置转换后的变量和数值列名。我们通过两个实例对 pandas.DataFrame.melt()
的使用进行了详细的介绍,希望读者能够掌握其基本使用方法,能够灵活地运用在实际数据分析中。