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