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

参考:pandas melt() API 文档

bannerAds