pandas 透视 Dataframe 和一次热编码[重复]

798qvoo8  于 2023-04-19  发布在  其他
关注(0)|答案(1)|浏览(121)

此问题已在此处有答案

Pandas: Get Dummies(5个答案)
7天前关闭
这篇文章7天前被编辑并提交审查。
我有一个pandas DataFrame,如下所示:

df = pd.DataFrame({
    'Name': ['John', 'Mary', 'Mark', 'Sarah', 'John', 'Sarah', 'John'],
    'Email': ['john@example.com', 'mary@example.com', 'mark@example.com', 'sarah@example.com', 'john@example.com', 'sarah@example.com', 'john@example.com'],
    'Role_Name': ['Admin', 'User', 'Admin', 'User', 'Admin', 'Admin', 'User'],
    'Last_Login': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-01', '2022-01-05', '2022-01-06'],
    'Organization_Name': ['Org1', 'Org2', 'Org1', 'Org2', 'Org2', 'Org2', 'Org3'],
    'Created_By_Name': ['SuperUser', 'SuperUser', 'SuperUser2', 'SuperUser2', 'SuperUser', 'SuperUser', 'Eve'],
    'Modified_By_Name': ['SuperUser', 'SuperUser', 'SuperUser2', 'SuperUser2', 'SuperUser', 'SuperUser2', 'SuperUser2']
})

此DataFrame包含有关各种用户的信息。某些用户多次出现在同一角色中,但可以访问不同的机构。
我想修改此DataFrame,使每个唯一的Email和Role_Name组合都有一行(例如,对于John将有两行,一行用于管理员角色,一行用于用户角色)。我希望Organization_Name列变为One-Hot Encoded,以便每个机构都有一个1列(此人有权访问此机构)和0 s(此人无权访问此机构)。
最后的DataFrame应该是这样的:

df = pd.DataFrame({
    'Name': ['John', 'Mary', 'Mark', 'Sarah', 'Sarah', 'John'],
    'Email': ['john@example.com', 'mary@example.com', 'mark@example.com', 'sarah@example.com', 'sarah@example.com', 'john@example.com'],
    'Role_Name': ['Admin', 'User', 'Admin', 'User', 'Admin', 'User'],
    'Last_Login': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-06'],
    'Created_By_Name': ['SuperUser', 'SuperUser', 'SuperUser2', 'SuperUser2', 'SuperUser', 'SuperUser2'],
    'Modified_By_Name': ['SuperUser', 'SuperUser', 'SuperUser2', 'SuperUser2', 'SuperUser2', 'SuperUser2'],
    'Org1': [1, 0, 1, 0, 0, 0],
    'Org2': [1, 1, 0, 1, 1, 0],
    'Org3': [0, 0, 0, 0, 0, 1]
})

对于如何做到这一点,有什么建议吗?
我已经尝试使用pivot_table功能来实现这一点,但没有成功。
这与以下情况不同:Pandas: Get Dummies从我的示例输出中可以看到,我要求给定的行可以有多于1个Organization。例如,正如我在最初的帖子中提到的,John应该有2行,而不是3行。也许One-Hot是错误的术语。

whlutmcx

whlutmcx1#

join a crosstab,同时删除带有pop的列:

df = df.join(pd.crosstab(df.index, df.pop('Organization_Name')))

或者,如果每个索引只有一个匹配项,则为get_dummies

df = df.join(pd.get_dummies(df.index, df.pop('Organization_Name')))

输出:

Name              Email Role_Name  Last_Login Created_By_Name Modified_By_Name  Org1  Org2  Org3
0   John   john@example.com     Admin  2022-01-01       SuperUser        SuperUser     1     0     0
1   Mary   mary@example.com      User  2022-01-02       SuperUser        SuperUser     0     1     0
2   Mark   mark@example.com     Admin  2022-01-03      SuperUser2       SuperUser2     1     0     0
3  Sarah  sarah@example.com      User  2022-01-04      SuperUser2       SuperUser2     0     1     0
4   John   john@example.com     Admin  2022-01-01       SuperUser        SuperUser     0     1     0
5  Sarah  sarah@example.com     Admin  2022-01-05       SuperUser       SuperUser2     0     1     0
6   John   john@example.com      User  2022-01-06             Eve       SuperUser2     0     0     1

相关问题