如何使用 pd.melt() 将 Pandas DataFrame 从宽格式重塑为长格式?

当前位置: 剧情吧 > php教程>
电视猫时间: 2024-12-22 15:24:25

  如何使用 pd.melt() 将 Pandas DataFrame 从宽格式重塑为长格式?

在数据分析中,数据的长宽格式转换是一个常见需求。pandas.melt() 是 Pandas 提供的一种便捷方法,用于将宽格式数据转换为长格式。以下是关于如何使用 pd.melt() 的详解及示例:


1. 什么是宽格式和长格式?

  • 宽格式:数据中包含多个列,每列通常表示不同的变量。
    • 示例:
      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() 将宽格式数据转换为长格式。


2. 基本语法

pd.melt(
    frame,                # 要操作的数据框
    id_vars=None,         # 保持不变的列
    value_vars=None,      # 要转换的列,默认为所有非 id_vars 的列
    var_name=None,        # 转换后变量列的名称
    value_name="value",   # 转换后值列的名称
    col_level=None,       # 对于多级列标签,指定层级
    ignore_index=True     # 是否忽略原始索引
)

3. 示例与讲解

示例 1:基本用法

将宽格式数据转换为长格式。

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

示例 2:选择性转换列

如果只需转换部分列,使用 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

示例 3:修改列名

通过 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

示例 4:多级列名

对于多级列数据框,可以通过 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

4. 注意事项

  1. 保留的列
    • id_vars 指定要保持不变的列,所有未指定的列都会被转换。
  2. 默认列名
    • 如果未指定 var_name 或 value_name,默认使用 variable 和 value
  3. 多级索引支持
    • 如果数据框有多级列名,需要用 col_level 指定列层级。

5. 优势与应用场景

  • 数据清洗:将数据重塑为长格式以适应分析工具(如 Seaborn、Matplotlib)。
  • 整合多变量:便于对变量执行批量操作,如分组统计或可视化。
  • 交互性工具:适用于需要长格式数据的工具(如 Plotly)。

总结

使用 pd.melt() 转换宽格式为长格式非常高效,尤其是在处理数据可视化和分析的场景中。通过理解参数的作用,可以灵活应对各种复杂的数据重塑需求。

    最新电视剧
    热门电视剧
    影视资讯
    最新剧情排行榜
    最新电视剧剧情