熊猫的melt()函数和通过pivot()函数进行unmelt
熊猫的melt()函数用于将DataFrame的格式从宽变为长。它用于创建一个特定格式的DataFrame对象,其中一个或多个列充当标识符。所有剩余的列都被视为值并展开到行轴上,只保留两列 – 变量和数值。
1. 字典压缩(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()函数来取消融合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)
# unmelting using pivot()
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 文档