按组检查非重复Python

时间:2018-11-19 20:48:10

标签: python pandas duplicates

我想检查非重复项并返回所有这些非重复项,但仅当这些键显示多次时才返回。例如,

Var  Code   Description
1    A      ABC
2    B      EF
1    A      ABCD
2    B      EF
1    B      ABC
3    C      DD

我希望得到这样的结果

Var  Code Description
1    A    ABC
1    A    ABCD

我想要此表的原因是检测哪个(变量,代码)对具有多个描述,因为在我的情况下,如果它具有多个描述,则意味着这些对的描述应修改为唯一。

此表返回具有相同变量名称和相同代码名称但描述不同的行。因为对于我的数据,变量的代码应仅具有一个描述,而不是多个描述。

不返回3 C DD的原因是因为只有一个有关(3,C)对的记录,而DD是对此对的唯一描述。

未返回2 B EF是因为尽管两行包含(2,B)对,但它们具有相同的描述,这是正常的。

不返回1 B ABC是因为虽然var 1显示3次,但(1,B)对仅显示1次并且仅具有一个描述ABC。

有解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用groupby并使用nunique过滤行

new_df = df.groupby(['Var', 'Code']).filter(lambda x: x['Description'].nunique() > 1) 

    Var Code    Description
0   1   A       ABC
2   1   A       ABCD

答案 1 :(得分:0)

msk1 = df.duplicated(subset=['Code', 'Var'], keep=False)
msk2 = df.duplicated(subset=['Code', 'Var', 'Description'], keep=False)
msk3 = msk1 & ~msk2
df[msk3]

# msk1 filters to all rows where both Var and Code are duplicated
print(df[msk1])
Var  Code Description
1    A    ABC
1    A    ABCD
2    B    EF
2    B    EF

# msk2 further filters to where Var Code and Description are duplicated 
print(df[msk2])
Var Code Description 
2   B    EF
2   B    EF

# so then finally msk3 is msk1 without msk2 
# give me all rows where Var and Code are duplicated 
# except for the ones where the Description is also duplicated
# - the desired result 
print(df[msk3])
Var  Code Description
1    A    ABC
1    A    ABCD