Pandas 的 melt 函数是用于将宽格式数据集转换为长格式数据集的工具。这种转换在数据清洗和准备阶段非常有用,尤其是在你需要将表格数据转换为更易于分析的形式时。
每个观测值占据一行。
每个变量占据一列。
长格式通常用于数据建模和数据可视化。
使用 melt 函数的典型场景:
当你有多个列需要被转换为单一测量值时。
当你需要将宽格式数据集转换为长格式以进行进一步的分析。
id_vars: 用于指定不参与熔化操作的列名,它们将作为新长格式 DataFrame 的列。
value_vars: 需要被熔化的列名,它们的值将被展开到新 DataFrame 的某一列。
var_name: 用于指定新长格式 DataFrame 中,来自 value_vars 的列名的列名。
value_name: 用于指定新长格式 DataFrame 中,包含 value_vars 列值的列名。
col_level: 如果输入的 DataFrame 是多级索引(MultiIndex),这个参数用于指定哪一级别将被熔化。
import numpy as np
import pandas as pd
pd.melt(frame, id_vars=[], value_vars=[], var_name="旧列名新列名", value_name="值的列名")
frame: 接收一个DataFrame
id_vars: 不需要进行列转行的字段, 比如这里的"姓名"和"水果", 在列转行之后会自动进行匹配
value_vars: 需要进行列转行的字段
var_name: 第四个参数, 我们说列转行之后会生成两个列, 第一个列存储的值是"列转行之前的列的列名",第二个列存储的值是"列转行之前的列的值"。但是生成的两个列总要有列名吧,所以var_name就是生成的第一个列的列名
value_name: 生成的第二个列的列名
col_level: 针对于具有二级列名的DataFrame, 这个一般可以不用管
df = pd.DataFrame([{'类别': '黄水果', '水果': '香蕉', '点赞': 14, '投币': 7}, {'类别': '黄水果', '水果': '菠萝', '点赞': 30, '投币': 15}, {'类别': '黄水果', '水果': '柠檬', '点赞': 50, '投币': 25}, {'类别': '红水果', '水果': '草莓', '点赞': 160, '投币': 80}, {'类别': '红水果', '水果': '苹果', '点赞': 6, '投币': 3}, {'类别': '红水果', '水果': '樱桃', '点赞': 8, '投币': 4}])
类别 | 水果 | 点赞 | 投币 | |
---|---|---|---|---|
0 | 黄水果 | 香蕉 | 14 | 7 |
1 | 黄水果 | 菠萝 | 30 | 15 |
2 | 黄水果 | 柠檬 | 50 | 25 |
3 | 红水果 | 草莓 | 160 | 80 |
4 | 红水果 | 苹果 | 6 | 3 |
5 | 红水果 | 樱桃 | 8 | 4 |
df2 = pd.melt(df, id_vars=["类别", "水果"],
value_vars=["点赞", "投币"],
var_name="反馈",
value_name="数量")
类别 | 水果 | 反馈 | 数量 | |
---|---|---|---|---|
0 | 黄水果 | 香蕉 | 点赞 | 14 |
1 | 黄水果 | 菠萝 | 点赞 | 30 |
2 | 黄水果 | 柠檬 | 点赞 | 50 |
3 | 红水果 | 草莓 | 点赞 | 160 |
4 | 红水果 | 苹果 | 点赞 | 6 |
5 | 红水果 | 樱桃 | 点赞 | 8 |
6 | 黄水果 | 香蕉 | 投币 | 7 |
7 | 黄水果 | 菠萝 | 投币 | 15 |
8 | 黄水果 | 柠檬 | 投币 | 25 |
9 | 红水果 | 草莓 | 投币 | 80 |
10 | 红水果 | 苹果 | 投币 | 3 |
11 | 红水果 | 樱桃 | 投币 | 4 |