Pandas删除符合条件的重复项

4
我想基于子集来使用df.drop_duplicates(),但同时也忽略特定列具有的值。
例如...
                 v1      v2     v3      
ID                                                          
148         8751704.0    G      dog   
123         9082007.0    G      dog  
123         9082007.0    G      dog 
123         9082007.0    G      cat   

我想去除重复的[ID, v1],但是忽略v3等于cat的情况,代码如下:

full_df.drop_duplicates([ID, v1], inplace=True, conditional=exclude v3 = cat)

希望这样说得清楚。

2个回答

7

使用 布尔索引Series.duplicated 以及 pd.Index.duplicated 来进行操作:

df[~(df['v1'].duplicated() & df.index.duplicated()) | df['v3'].eq('cat')]

输出

            v1 v2   v3
ID                    
148  8751704.0  G  dog
123  9082007.0  G  dog
123  9082007.0  G  cat

如果ID不是索引:

df[~df[['ID', 'v1']].duplicated() | df['v3'].eq('cat')]

当我尝试运行你的第二个解决方案时,出现了以下错误:KeyError: ('ID', 'v1') - Bob
啊,是啊。为了速度,你认为最快的解决方案是什么? - Bob
如果ID是索引,我认为使用pd.Index.duplicated的解决方案更快,因为您不必使用reset_index。但我不确定,因为我还没有用各种大小的DataFrame进行过测试。 无论如何,我认为这两个解决方案都很好。 - ansev

6

您可以使用按位与来添加另一个条件,以确保cat不是cat

df[~(df.reset_index().duplicated(['ID', 'v1']) & df.v3.ne('cat').values).values]

        v1     v2   v3
148  8751704.0  G  dog
123  9082007.0  G  dog
123  9082007.0  G  cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接