Answers:
现在,通过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)
df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)
吧?
df.drop_duplicates(subset=[df.columns[0:2]], keep = False)
只想添加到本对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
实际上,仅删除第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]
df.drop_duplicates(['A','C'])
默认值来保留一个观察值,就像我在问题中提到的那样,取第一个或最后一个作为结果-尽管我刚刚意识到我在写内存时输入了错误的关键字。我想要删除的所有行都与感兴趣的列相同(示例数据中的A和C)。
试试这些各种各样的东西
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')