首页 > 解决方案 > Pandas:根据某些条件删除重复行

问题描述

我在 excel 中有一个数据集,如下所示。

name,role,org
abc,admin,123
abc,agent,123
abc,end-user,123
abc,admin,124
abc,admin,123
bcd,admin,125
abc,admin,126
abc,agent,127
abc,agent,123
abc,end-user,130
abc,end-user,130
abc,agent,123
bc,agent,123
bc,admin,123
vcf,end-user,123

我正在尝试根据某些条件过滤一些用户。

管理员和代理不能在一个组织中有多个名称。

一个组织可以有许多同名的最终用户(所以希望最终用户保持原样)

从昨天开始我尝试了很多东西,但没有运气。这是我正在尝试的

df.loc[(df['role'] == 'agent' ) | (df['role'] == 'admin' ) | (~df['org'] )]

但上面的代码正是将行作为输入返回。

这个你能帮我吗

预期输出

name,role,org
abc,admin,123
abc,agent,123
abc,end-user,123
abc,admin,124
bcd,admin,125
abc,admin,126
abc,agent,127
abc,end-user,130
abc,end-user,130
bc,agent,123
bc,admin,123
vcf,end-user,123

标签: pythonpandas

解决方案


使用Series.isinwithDataFrame.duplicated删除agent, admin每 3 列的重复项:

df1 = df[~(df['role'].isin(['agent','admin']) & df[['org', 'role', 'name']].duplicated())]

如果只有 3 列:

df1 = df[~(df['role'].isin(['agent','admin']) & df.duplicated())]

print (df1)
   name      role  org
0   abc     admin  123
1   abc     agent  123
2   abc  end-user  123
3   abc     admin  124
5   bcd     admin  125
6   abc     admin  126
7   abc     agent  127
9   abc  end-user  130
10  abc  end-user  130
12   bc     agent  123
13   bc     admin  123
14  vcf  end-user  123

推荐阅读