Pandas 的melt()和使用pivot()函数取消融化
时间:2020-02-23 14:42:08 来源:igfitidea点击:
Pandas 的melt()函数用于将DataFrame的格式从宽更改为长。
它用于创建DataFrame对象的特定格式,其中一个或者多个列用作标识符。
其余所有列均被视为值,并且不会在行轴上旋转,只有两列-变量和值。
1.Pandas melt()示例
通过示例查看时,melt()函数的用法更加清晰。
import pandas as pd d1 = {"Name": ["hyman", "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 hyman 1 CEO 1 Lisa 2 Editor 2 David 3 Author ID variable value 0 1 Name hyman 1 2 Name Lisa 2 3 Name David 3 1 Role CEO 4 2 Role Editor 5 3 Role Author
我们可以传递" var_name"和" value_name"参数来更改"变量"和"值"的列名。
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 hyman 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 hyman Role CEO 1 Lisa Role Editor 2 David Role Author
4.使用pivot()函数解散DataFrame
我们可以使用pivot()函数取消融化DataFrame对象并获取原始数据帧。
ivot()函数的"索引"参数值应与" id_vars"值相同。
"列"值应作为"变量"列的名称传递。
import pandas as pd d1 = {"Name": ["hyman", "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) # unmelting using pivot() df_unmelted = df_melted.pivot(index='ID', columns='Attribute') print(df_unmelted)
输出:
ID Attribute Value 0 1 Name hyman 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 hyman 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 hyman CEO 1 2 Lisa Editor 2 3 David Author