Pandas数据重塑完全指南:melt()与pivot()函数实现长宽格式转换
熊猫(Pandas)的melt()函数和通过pivot()函数进行unmelt
熊猫(Pandas)的melt()函数用于将DataFrame的格式从宽格式转换为长格式。它能够创建一个特定格式的DataFrame对象,其中一个或多个列作为标识符变量(id_vars)。所有剩余的列被视为测量变量(value_vars)并被”融化”到行轴上,最终只保留两列 – 变量列和值列。
1. 熊猫(Pandas)函数中的melt()示例
通过一个具体示例来观察,使用melt()函数会更加清晰明了。
import pandas as pd
d1 = {"Name": ["Pankaj", "Lisa", "David"], "ID": [1, 2, 3], "Role": ["CEO", "Editor", "Author"]}
df = pd.DataFrame(d1)
print(df)
df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"])
print(df_melted)
输出结果:
Name ID Role
0 Pankaj 1 CEO
1 Lisa 2 Editor
2 David 3 Author
ID variable value
0 1 Name Pankaj
1 2 Name Lisa
2 3 Name David
3 1 Role CEO
4 2 Role Editor
5 3 Role Author
我们可以通过传递”var_name”和”value_name”参数来自定义”variable”和”value”列的名称。
df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"], var_name="Attribute", value_name="Value")
推荐阅读:Python Pandas 教程
2. 将多列作为id_vars
让我们看看当我们将多个列作为id_vars参数传递时会发生什么。
df_melted = pd.melt(df, id_vars=["ID", "Name"], value_vars=["Role"])
print(df_melted)
结果:
ID Name variable value
0 1 Pankaj Role CEO
1 2 Lisa Role Editor
2 3 David Role Author
3. 使用melt()函数跳过列
在下一个示例中,我们不需要使用源DataFrame中的所有列。让我们跳过”ID”列。
df_melted = pd.melt(df, id_vars=["Name"], value_vars=["Role"])
print(df_melted)
输出结果:
Name variable value
0 Pankaj Role CEO
1 Lisa Role Editor
2 David Role Author
4. 使用pivot()函数将未融合的DataFrame进行重塑
我们可以使用pivot()函数来取消融合(unmelt)DataFrame对象并获取原始DataFrame。pivot()函数的’index’参数值应与’id_vars’值相同。’columns’的值应作为’variable’列的名称传递。
import pandas as pd
d1 = {"Name": ["Pankaj", "Lisa", "David"], "ID": [1, 2, 3], "Role": ["CEO", "Editor", "Author"]}
df = pd.DataFrame(d1)
# print(df)
df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"], var_name="Attribute", value_name="Value")
print(df_melted)
# 使用pivot()进行unmelt操作
df_unmelted = df_melted.pivot(index='ID', columns='Attribute')
print(df_unmelted)
输出:
ID Attribute Value
0 1 Name Pankaj
1 2 Name Lisa
2 3 Name David
3 1 Role CEO
4 2 Role Editor
5 3 Role Author
Value
Attribute Name Role
ID
1 Pankaj CEO
2 Lisa Editor
3 David Author
未进行融合处理的DataFrame数值与原始的DataFrame相同。但需要对列和索引进行一些微小的调整,使其与原始数据框完全一致。
df_unmelted = df_unmelted['Value'].reset_index()
df_unmelted.columns.name = None
print(df_unmelted)
输出:
ID Name Role
0 1 Pankaj CEO
1 2 Lisa Editor
2 3 David Author