我有一个这样的熊猫数据框:
a b c
0 1 1 1
1 1 1 0
2 2 4 1
3 3 5 0
4 3 5 0
其中前两列(“ a”和“ b”)是ID,而最后一列(“ c”)是验证(0 = neg,1 = pos)。我确实知道如何根据前2列的值删除重复项,但是在这种情况下,我也想摆脱不一致的数据,即重复数据被验证为正数和负数。因此,例如前两行是重复的,但是不一致,因此我应该删除整个记录,而后两行既是重复的又是一致的,那么我将保留其中一条记录。预期结果应该是:
a b c
0 2 4 1
1 3 5 0
实际数据框每个组可以有两个以上重复项,并且 如您所见,索引也已更改。谢谢。
答案 0 :(得分:5)
首先用GroupBy.transform
用SeriesGroupBy.nunique
过滤行,以仅使用boolean indexing
然后用DataFrame.drop_duplicates
过滤唯一值组:
df = (df[df.groupby(['a','b'])['c'].transform('nunique').eq(1)]
.drop_duplicates(['a','b'])
.reset_index(drop=True))
print (df)
a b c
0 2 4 1
1 3 5 0
详细信息:
print (df.groupby(['a','b'])['c'].transform('nunique'))
0 2
1 2
2 1
3 1
4 1
Name: c, dtype: int64