详解pandas.DataFrame.melt()(将宽数据转换为长数据)函数使用方法

  • Post category:Python

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() 的使用进行了详细的介绍,希望读者能够掌握其基本使用方法,能够灵活地运用在实际数据分析中。