我有以下df:
roles = [("user1", "rol1", "rol2"),
("user1", "rol4", "rol1"),
("user3", "rol1", "rol3"),
("user3", "rol1", "rol3"),
("user1", "rol1", "rol3"),
("user1", "rol2", "rol1"),
("user2", "rol5", "rol6"),
("user2", "rol6", "rol5"),
("user2", "rol1", "rol3"),
("user3", "rol3", "rol1"),
("user1", "rol1", "rol4"),
("user3", "rol3", "rol1"),
];
df = pd.DataFrame(roles, columns=["User", "Rol_1", "Rol_2"])
如果"Rol_1"
被用户使用,则列"Rol_2"
和("Rol_1", "Rol_2") == ("Rol_2", "Rol_1")
的组合是相同的。我需要删除组合相同的行(按用户)l;
即由于同一用户存在
User = "user1" and (Rol_1,Rol_2) = ("rol4","rol1")
,因此必须删除(Rol_1,Rol_2) = ("rol1","rol4")
的行。
此示例的预期结果将是:
rolexp = [("user1", "rol1", "rol2"),
("user1", "rol4", "rol1"),
("user1", "rol1", "rol3"),
("user2", "rol5", "rol6"),
("user2", "rol1", "rol3"),
("user3", "rol1", "rol3"),
];
df2 = pd.DataFrame(rolexp, columns=["User", "Rol_1", "Rol_2"])
有可能实现这个目标吗?
答案 0 :(得分:1)
一个选择是创建一个新列,每行包含一组所有角色,然后删除重复项。
df['all_roles'] = df.drop(columns='User').apply(
lambda x: ', '.join(sorted(list(set(x)))), axis=1)
df.drop_duplicates(['User', 'all_roles'], inplace=True)
print(df)
输出
User Rol_1 Rol_2 all_roles
0 user1 rol1 rol2 rol1, rol2
1 user1 rol4 rol1 rol1, rol4
2 user3 rol1 rol3 rol1, rol3
4 user1 rol1 rol3 rol1, rol3
6 user2 rol5 rol6 rol5, rol6
8 user2 rol1 rol3 rol1, rol3
答案 1 :(得分:1)
如果可以保留任一组合(rol1 rol4
而不是rol4 rol1
),则可以通过在np.sort
和axis=1
上使用drop_duplicates
来完成;
cols = ['Rol_1','Rol_2']
u = df.assign(**pd.DataFrame(np.sort(df[cols],axis=1),columns=cols,index=df.index))
out = u.drop_duplicates(['User']+cols).sort_values("User")
print(out)
User Rol_1 Rol_2
0 user1 rol1 rol2
1 user1 rol1 rol4
4 user1 rol1 rol3
6 user2 rol5 rol6
8 user2 rol1 rol3
2 user3 rol1 rol3