删除Python Pandas中的所有重复行

pandas drop_duplicates函数非常适合“独立化”数据drop_duplicates 。 但是,要传递的关键字参数之一是take_last=Truetake_last=False ,而我想删除跨列的一个子集重复的所有行。 这可能吗?

  ABC 0 foo 0 A 1 foo 1 A 2 foo 1 B 3 bar 1 A 

作为一个例子,我想删除列AC匹配的行,所以这应该删除行0和1。

现在使用drop_duplicates和keep参数在pandas中更容易。

 import pandas as pd df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) df.drop_duplicates(subset=['A', 'C'], keep=False) 

使用groupbyfilter

 import pandas as pd df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1) 

实际上,删除第0行和第1行只需要(保留包含匹配的A和C的任何观察值):

 In [335]: df['AC']=df.A+df.C In [336]: print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'. ABC AC 2 foo 1 B fooB 3 bar 1 A barA [2 rows x 4 columns] 

但是我怀疑你真正想要的是什么(保留了一个包含匹配的A和C的观察值):

 In [337]: print df.drop_duplicates('AC') ABC AC 0 foo 0 A fooA 2 foo 1 B fooB 3 bar 1 A barA [3 rows x 4 columns] 

编辑:

现在更清楚了,因此:

 In [352]: DG=df.groupby(['A', 'C']) print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1]) ABC 2 foo 1 B 3 bar 1 A [2 rows x 3 columns] 

只要在drop_duplicates上添加Ben的答案就可以了 :

keep :{'first','last',False},默认'first'

  • 第一:删除第一次出现以外的重复。

  • 最后:删除最后一次出现的重复项。

  • 假:删除所有重复项。

所以设置keep为假我们给你想要的答案。

DataFrame.drop_duplicates(* args,** kwargs)返回删除重复行的DataFrame,可选地仅考虑某些列

参数:subset:列标签或者标签序列,可选只考虑某些列标识重复项,默认情况下使用所有列keep:{'first','last',False},默认'first'first:删除重复项第一次出现。 最后:删除最后一次出现的重复项。 假:删除所有重复项。 take_last:不build议使用inplace:boolean,default False是否删除重复项或返回副本cols:仅用于kwargs子集的参数[deprecated]返回:deduplicated:DataFrame