如何使用 pd.melt() 将 Pandas DataFrame 从宽格式重塑为长格式?
在数据分析中,数据的长宽格式转换是一个常见需求。pandas.melt() 是 Pandas 提供的一种便捷方法,用于将宽格式数据转换为长格式。以下是关于如何使用 pd.melt() 的详解及示例:
Name Subject Math Science English
Alice Class A 85 90 78
Bob Class B 88 92 81
Name Subject Variable Value
Alice Class A Math 85
Alice Class A Science 90
Alice Class A English 78
Bob Class B Math 88
Bob Class B Science 92
Bob Class B English 81
pd.melt() 将宽格式数据转换为长格式。
pd.melt(
frame, # 要操作的数据框
id_vars=None, # 保持不变的列
value_vars=None, # 要转换的列,默认为所有非 id_vars 的列
var_name=None, # 转换后变量列的名称
value_name="value", # 转换后值列的名称
col_level=None, # 对于多级列标签,指定层级
ignore_index=True # 是否忽略原始索引
)
将宽格式数据转换为长格式。
import pandas as pd
# 宽格式数据
df = pd.DataFrame({
"Name": ["Alice", "Bob"],
"Math": [85, 88],
"Science": [90, 92],
"English": [78, 81]
})
print("宽格式数据:")
print(df)
# 使用 pd.melt
df_long = pd.melt(df, id_vars=["Name"], var_name="Subject", value_name="Score")
print("\n长格式数据:")
print(df_long)
输出:
宽格式数据:
Name Math Science English
0 Alice 85 90 78
1 Bob 88 92 81
长格式数据:
Name Subject Score
0 Alice Math 85
1 Bob Math 88
2 Alice Science 90
3 Bob Science 92
4 Alice English 78
5 Bob English 81
如果只需转换部分列,使用 value_vars 指定目标列。
df_long = pd.melt(df, id_vars=["Name"], value_vars=["Math", "English"], var_name="Subject", value_name="Score")
print(df_long)
输出:
Name Subject Score
0 Alice Math 85
1 Bob Math 88
2 Alice English 78
3 Bob English 81
通过 var_name 和 value_name 自定义输出列的名称。
df_long = pd.melt(df, id_vars=["Name"], var_name="Exam", value_name="Marks")
print(df_long)
输出:
Name Exam Marks
0 Alice Math 85
1 Bob Math 88
2 Alice Science 90
3 Bob Science 92
4 Alice English 78
5 Bob English 81
对于多级列数据框,可以通过 col_level 指定需要操作的列层级。
# 创建多级列数据框
df_multi = pd.DataFrame({
("Name", ""): ["Alice", "Bob"],
("Scores", "Math"): [85, 88],
("Scores", "Science"): [90, 92]
})
print("多级列数据:")
print(df_multi)
# 转换为长格式
df_long = pd.melt(df_multi, id_vars=[("Name", "")], col_level=1, var_name="Subject", value_name="Score")
print("\n长格式数据:")
print(df_long)
输出:
多级列数据:
Name Scores
Math Science
0 Alice 85 90
1 Bob 88 92
长格式数据:
Name Subject Score
0 Alice Math 85
1 Bob Math 88
2 Alice Science 90
3 Bob Science 92
id_vars 指定要保持不变的列,所有未指定的列都会被转换。var_name 或 value_name,默认使用 variable 和 value。col_level 指定列层级。使用 pd.melt() 转换宽格式为长格式非常高效,尤其是在处理数据可视化和分析的场景中。通过理解参数的作用,可以灵活应对各种复杂的数据重塑需求。
2025 年陆剧市场依旧热度爆棚
时间:2025-09-19
阵地央一首播:年度高品质大剧,深度解锁文化抗战三重非凡意义
时间:2025-09-18
陈展鹏刘佩玥《巨塔之后》今首播
时间:2025-08-28
生万物大结局惊现最招恨角色,原来真正的坏都披着善的“羊皮”!
时间:2025-08-28
归队6集燃爆:袁姗姗化身“战地玫瑰”,实战军医双在线超吸睛!
时间:2025-08-28
许凯田曦薇新剧《子夜归》首播,点击率位列第七
时间:2025-08-21