删除Python Pandas中的所有重复行
pandas
drop_duplicates
函数非常适合“独立化”数据drop_duplicates
。 但是,要传递的关键字参数之一是take_last=True
或take_last=False
,而我想删除跨列的一个子集重复的所有行。 这可能吗?
ABC 0 foo 0 A 1 foo 1 A 2 foo 1 B 3 bar 1 A
作为一个例子,我想删除列A
和C
匹配的行,所以这应该删除行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)
使用groupby
和filter
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