删除Python Pandas中的所有重复行

Jam*_*ull 130 python duplicates pandas

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
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*Ben 194

现在使用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)
Run Code Online (Sandbox Code Playgroud)

  • 你可以尝试`df.drop_duplicates(subset = [df.columns [0:2]],keep = False) (4认同)
  • 如果我的列没有明确标记怎么办?如何仅根据索引选择列? (2认同)
  • 也许是df.reindex(df.iloc [:,[0,2]]。drop_duplicates(keep = False).index)`吗? (2认同)

小智 47

只想在drop_duplicates上添加Ben的答案:

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

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

  • last:删除重复项,除了最后一次出现.

  • 错误:删除所有重复项.

所以设置keep为False我们给你想要的答案.

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

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


Ram*_*lam 19

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

df.drop_duplicates(keep=False)
Run Code Online (Sandbox Code Playgroud)

要么

df.drop_duplicates(keep=False, inplace=False)
Run Code Online (Sandbox Code Playgroud)

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

df.drop_duplicates(keep=False, inplace=True)
Run Code Online (Sandbox Code Playgroud)

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


HYR*_*YRY 10

使用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)
Run Code Online (Sandbox Code Playgroud)


CT *_*Zhu 8

实际上,删除第 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]
Run Code Online (Sandbox Code Playgroud)

但我怀疑你真正想要的是这个(保留一个包含匹配 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]
Run Code Online (Sandbox Code Playgroud)

编辑:

现在更清楚了,因此:

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]
Run Code Online (Sandbox Code Playgroud)


Pri*_*pta 7

尝试这些不同的东西

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')
Run Code Online (Sandbox Code Playgroud)

或者

>>>df.drop_duplicates( keep='first')
Run Code Online (Sandbox Code Playgroud)

或者

>>>df.drop_duplicates( keep='last')
Run Code Online (Sandbox Code Playgroud)