在Python中跨多个列删除所有重复行

在Python中跨多个列删除所有重复行,python,pandas,duplicates,drop-duplicates,Python,Pandas,Duplicates,Drop Duplicates,pandasdrop\u duplicates功能非常适合“非限定”数据帧。但是,要传递的关键字参数之一是take_last=True或take_last=False,而我希望删除跨列子集重复的所有行。这可能吗 A B C 0 foo 0 A 1 foo 1 A 2 foo 1 B 3 bar 1 A 例如,我想删除列A和C上匹配的行,因此这应该删除行0和1。实际上,删除行0和1只需要(保留包含匹配的A和C的任何观察结果): 但我怀疑你真正想要的

pandas
drop\u duplicates
功能非常适合“非限定”数据帧。但是,要传递的关键字参数之一是
take_last=True
take_last=False
,而我希望删除跨列子集重复的所有行。这可能吗

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

例如,我想删除列
A
C
上匹配的行,因此这应该删除行0和1。

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

但我怀疑你真正想要的是这个(保留一个包含匹配A和C的观察结果):

编辑: 因此,现在更清楚了:

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])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]

使用
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)

现在使用和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)

我只想补充一下Ben的回答:

保留
:{'first','last',False},默认值为'first'

  • 第一:除去第一次出现的重复项

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

  • False:删除所有重复项。

因此,将
keep
设置为False将给出所需的答案

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

参数:子集:列标签或标签序列,可选 默认情况下,只考虑某些列来标识重复项。 使用所有列保留:{'first','last',False},默认值 “first”first:删除除第一次出现之外的重复项。最后的 :删除除最后一次出现之外的重复项。错误:放弃所有 复制品。take_last:disprecated in place:boolean,默认为False 是就地放置副本还是返回副本cols:kwargs subset[deprecated]的唯一参数返回:已消除重复: 数据帧


如果希望结果存储在另一个数据集中:

df.drop_duplicates(keep=False)

如果需要更新相同的数据集:

df.drop_duplicates(keep=False, inplace=True)

上面的示例将删除所有重复项并保留一个,类似于SQL中的
DISTINCT*

尝试以下各种方法

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')


如果这是我想要的,我会使用
df.drop_duplicates(['A','C'])
作为默认值,保留一个观察值,按照我在问题中提到的第一个或最后一个-尽管我刚刚意识到我在从内存中写入时,关键字错了。我想要的是删除感兴趣的列(示例数据中的A和C)上所有相同的行。如果我的列没有显式标记,该怎么办?如何仅根据列的索引来选择列?可能是
df.reindex(df.iloc[:,[0,2]]。drop_duplicates(keep=False).index)
?您可以尝试
df.drop_duplicates(subset=[df.columns[0:2]],keep=False)
df.drop_duplicates(keep=False, inplace=False)
df.drop_duplicates(keep=False, inplace=True)
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')
>>>df.drop_duplicates( keep='first')
>>>df.drop_duplicates( keep='last')