pandas.DataFrame.melt()

306 阅读4分钟

pandas.DataFrame.melt() 是 Pandas 中用于 重塑 数据的一种方法,常用于将宽格式数据转换为长格式。它将 转换为 ,有时称之为“长格式化”或“堆叠”数据。这个函数特别适用于数据透视和分析中,帮助将多列的数据合并为单列。

基本语法

DataFrame.melt(id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
  • id_vars:表示不需要转换的列,这些列会作为标识符列保留下来。通常用于列标签中包含与观测值无关的信息(如类别、时间等)。
  • value_vars:指定要转换成行的列(也可以是所有列,如果未指定)。
  • var_name:可选,表示转换后新的变量列的名称,默认为 variable
  • value_name:可选,表示转换后新的值列的名称,默认为 value
  • col_level:用于处理具有多级列标签的 DataFrame,指定级别。

1. 基本用法

melt() 的主要作用是将多个列转换为一列。

示例:将 DataFrame 转换为长格式

import pandas as pd

# 创建示例 DataFrame
df = pd.DataFrame({
    'ID': [1, 2, 3],
    'Math': [90, 80, 70],
    'Science': [85, 75, 65]
})

# 使用 melt() 将列转换为行
result = df.melt(id_vars=['ID'], value_vars=['Math', 'Science'])
print(result)

输出

   ID   variable  value
0   1      Math     90
1   2      Math     80
2   3      Math     70
3   1   Science     85
4   2   Science     75
5   3   Science     65

解释

  • ID 列保持不变(作为标识符列),并且它与每一行对应。
  • MathScience 列的值被合并到一列 value 中,并且列名被合并到 variable 列。

2. 设置 var_namevalue_name

你可以设置自定义的列名来替代默认的 variablevalue

示例:自定义列名

result = df.melt(id_vars=['ID'], value_vars=['Math', 'Science'], var_name='Subject', value_name='Score')
print(result)

输出

   ID   Subject  Score
0   1      Math     90
1   2      Math     80
2   3      Math     70
3   1   Science     85
4   2   Science     75
5   3   Science     65

解释

  • var_name='Subject':将 variable 列重命名为 Subject
  • value_name='Score':将 value 列重命名为 Score

3. 将所有列转换为长格式

如果你不指定 value_varsmelt() 会将 所有列(除去 id_vars)都转换为长格式。

示例:将所有列转换为长格式

result = df.melt(id_vars=['ID'])
print(result)

输出

   ID  variable  value
0   1      Math     90
1   2      Math     80
2   3      Math     70
3   1   Science     85
4   2   Science     75
5   3   Science     65

4. 多级列(MultiIndex)转换

对于具有多级列的 DataFrame,melt() 可以处理并将数据展平。

示例:多级列转换

# 创建多级列的 DataFrame
df_multi = pd.DataFrame({
    ('Student', 'ID'): [1, 2, 3],
    ('Marks', 'Math'): [90, 80, 70],
    ('Marks', 'Science'): [85, 75, 65]
})

# 使用 melt() 转换
result = df_multi.melt(id_vars=[('Student', 'ID')], value_vars=[('Marks', 'Math'), ('Marks', 'Science')])
print(result)

输出

   Student  ID         variable  value
0        1   1         Math     90
1        2   2         Math     80
2        3   3         Math     70
3        1   1      Science     85
4        2   2      Science     75
5        3   3      Science     65

解释

  • id_vars=[('Student', 'ID')]:指定 StudentID 作为标识符列。
  • value_vars=[('Marks', 'Math'), ('Marks', 'Science')]:指定要转换的列。

5. 使用 col_level 处理多级列

当 DataFrame 拥有 多级列索引 时,melt() 还允许你指定 col_level 来选择特定的列级别。

示例:使用 col_level

# 创建多级列的 DataFrame
df_multi = pd.DataFrame({
    ('Student', 'ID'): [1, 2, 3],
    ('Marks', 'Math'): [90, 80, 70],
    ('Marks', 'Science'): [85, 75, 65]
})

# 使用 col_level 参数进行转换
result = df_multi.melt(id_vars=[('Student', 'ID')], value_vars=[('Marks', 'Math'), ('Marks', 'Science')], col_level=1)
print(result)

输出

   Student  ID  variable  value
0        1   1      Math     90
1        2   2      Math     80
2        3   3      Math     70
3        1   1   Science     85
4        2   2   Science     75
5        3   3   Science     65

6. 处理缺失值

melt() 会在转换过程中保持原始的缺失值(NaN)。如果你有缺失值,它们会出现在 value 列中。

示例:包含缺失值

df_with_nan = pd.DataFrame({
    'ID': [1, 2, 3],
    'Math': [90, None, 70],
    'Science': [85, 75, None]
})

result = df_with_nan.melt(id_vars=['ID'], value_vars=['Math', 'Science'])
print(result)

输出

   ID   variable  value
0   1      Math   90.0
1   2      Math    NaN
2   3      Math   70.0
3   1   Science   85.0
4   2   Science   75.0
5   3   Science    NaN

7. 与 pivot()pivot_table() 配合使用

melt() 适用于将数据从宽格式转换为长格式,而 pivot()pivot_table() 则用于将长格式转换为宽格式。你可以通过这两者之间的转换来调整数据结构,满足不同的分析需求。

总结

  • melt() 的作用:将宽格式数据转换为长格式数据,适用于数据透视和清洗。
  • id_vars:指定不需要转换的列。
  • value_vars:指定要转换成长格式的列。
  • var_namevalue_name:自定义转换后列的名称,默认分别为 variablevalue
  • col_level:适用于多级列(MultiIndex)的情况,允许选择特定的列级别进行转换。
  • melt() 的应用场景:适用于数据清理、透视表操作以及需要对多个变量进行堆叠或合并的场景。

melt() 是数据清洗中一个非常有用的工具,可以将多列数据整理为一个统一的结构,有助于进一步的分析或绘图。