首页 > 解决方案 > 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"])

有可能实现这个目标吗?

标签: pythonpandas

解决方案


一种选择是创建一个新列,每行包含一组所有角色,然后删除重复项。

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

推荐阅读