python - Pandas 在不同列中删除具有相同数据组合的行
问题描述
我有以下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"])
有可能实现这个目标吗?
解决方案
一种选择是创建一个新列,每行包含一组所有角色,然后删除重复项。
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
推荐阅读
- coldfusion - CFWheels 错误:元素 RETURNVALUE 在 LOC 中未定义
- javascript - 从标题下的降价列表中获取每个项目
- java - 安装了 JDK 8 的“警告:发生了非法反射访问操作”
- html - 发生错误后如何通过代码将已经打开的网页重新设置为焦点
- python - 为什么 Django 抱怨一个新的模型列是未知的而不是迁移它?
- sml - 如何与 SML 和 CM 共享数据类型声明
- mongodb - 蒙哥数据库。通过嵌套键查找文档并在文档中切片另一个键。我使用 GraphQl Apollo 服务器来处理与 db 的通信
- python - 无法正确找到列表中的子列表数量
- javascript - 具有复杂名称的全局变量与用于搜索的输入字段之间的真正区别是什么?
- python - 如何在 discord.py 的某个频道中嵌入用户加入?