熊猫在不同列中删除具有相同数据组合的行

时间:2020-09-04 16:28:03

标签: 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"])

有可能实现这个目标吗?

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.sortaxis=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