在Python Pandas中删除所有重复的行


158

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

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

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

Answers:


233

现在,通过drop_duplicates和keep参数,这在熊猫中要容易得多。

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)

2
如果我的列未明确标记怎么办?如何仅根据索引选择列?
Hamman Samuel

2
也许df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)吧?

5
您可以尝试df.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi '18

67

只想添加到本对drop_duplicates的答案中:

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

  • first:删除第一次出现的重复项。

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

  • False:删除所有重复项。

因此,将其设置keep为False将为您提供所需的答案。

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

参数:subset:列标签或标签序列,可选的仅考虑某些列来标识重复项,默认情况下使用所有列keep:{'first','last',False},默认为'first'first:删除重复项,除了第一次出现。last:除去最后一次出现的重复项。False:删除所有重复项。take_last:已弃用,就位:布尔值,默认为False是否将副本放置在适当位置或返回副本cols:仅kwargs子集的参数[不建议使用]返回:重复数据删除:DataFrame


25

如果要将结果存储在另一个数据集中:

df.drop_duplicates(keep=False)

要么

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

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

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

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


11

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

4

实际上,仅删除第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'.
     A  B  C    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')
     A  B  C    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])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]

1
如果那是我想要的,我将使用df.drop_duplicates(['A','C'])默认值来保留一个观察值,就像我在问题中提到的那样,取第一个或最后一个作为结果-尽管我刚刚意识到我在写内存时输入了错误的关键字。我想要删除的所有行都与感兴趣的列相同(示例数据中的A和C)。
杰米·布尔2014年

-1

试试这些各种各样的东西

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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.