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