Python 熊猫在条件允许的情况下丢弃复制品

Python 熊猫在条件允许的情况下丢弃复制品,python,pandas,Python,Pandas,我希望基于子集df.drop_duplicates(),但如果列具有特定值,也将忽略它 例如 v1 v2 v3 ID 148 8751704.0 G dog 123 9082007.0 G dog 123 9082007.0

我希望基于子集
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\u df.drop\u duplicates([ID,v1],inplace=True,conditional=exclude v3=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')]

您可以使用按位and链接另一个条件,以确保
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

当我尝试运行你的第二个解决方案时,我得到:
keyrerror:('ID','v1')
Ahh是的,对于速度,你认为什么是最快的解决方案?如果ID是索引,我认为这个带有
pd.index.duplicated
的解决方案更快,因为你不必使用
reset\u index
。但我不知道,因为我还没有用各种大小的数据帧对它进行测试。无论如何,我认为这两种解决方案都是好的
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