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列保持不变(作为标识符列),并且它与每一行对应。Math和Science列的值被合并到一列value中,并且列名被合并到variable列。
2. 设置 var_name 和 value_name
你可以设置自定义的列名来替代默认的 variable 和 value。
示例:自定义列名
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_vars,melt() 会将 所有列(除去 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')]:指定Student和ID作为标识符列。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_name和value_name:自定义转换后列的名称,默认分别为variable和value。col_level:适用于多级列(MultiIndex)的情况,允许选择特定的列级别进行转换。melt()的应用场景:适用于数据清理、透视表操作以及需要对多个变量进行堆叠或合并的场景。
melt() 是数据清洗中一个非常有用的工具,可以将多列数据整理为一个统一的结构,有助于进一步的分析或绘图。