Python-基于两列组合删除数据帧中的重复项?

Python-基于两列组合删除数据帧中的重复项?,python,pandas,sorting,dataframe,Python,Pandas,Sorting,Dataframe,我有一个Python中有3列的数据框架: Name1 Name2 Value Juan Ale 1 Ale Juan 1 并且希望消除基于列Name1和Name2组合的重复项 在我的示例中,两行相等(但顺序不同),我想删除第二行,只保留第一行,因此最终结果应该是: Name1 Name2 Value Juan Ale 1 任何想法都将非常感激 您可以转换为frozenset并使用 frozenset是必需的,而不是set,因为duplicated使用哈希检查重复项 与行相比

我有一个Python中有3列的数据框架:

Name1 Name2 Value
Juan  Ale   1
Ale   Juan  1
并且希望消除基于列Name1和Name2组合的重复项

在我的示例中,两行相等(但顺序不同),我想删除第二行,只保留第一行,因此最终结果应该是:

Name1 Name2 Value
Juan  Ale   1

任何想法都将非常感激

您可以转换为
frozenset
并使用

frozenset
是必需的,而不是
set
,因为
duplicated
使用哈希检查重复项


与行相比,列的缩放效果更好。对于大量行,使用@Wen的基于排序的算法。

使用
np.sort
duplicated

df[pd.DataFrame(np.sort(df[['Name1','Name2']].values,1)).duplicated()]
Out[614]: 
  Name1 Name2  Value
1   Ale  Juan      1
演出

df=pd.concat([df]*100000)

%timeit df[pd.DataFrame(np.sort(df[['Name1','Name2']].values,1)).duplicated()]
10 loops, best of 3: 69.3 ms per loop
%timeit df[~df[['Name1', 'Name2']].apply(frozenset, axis=1).duplicated()]
1 loop, best of 3: 3.72 s per loop
我知道我问这个问题有点晚了,但无论如何我还是要贡献自己的力量:)

您还可以使用
get\u dummies
add
创建可散列行的好方法

df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]
时间不如@Wen的答案好,但它仍然比
apply
+
freezed\u set

df=pd.concat([df]*1000000)
%timeit df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]
1.8 s ± 85 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df[pd.DataFrame(np.sort(df[['a','b']].values,1)).duplicated()]
1.26 s ± 19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df[~df[['a', 'b']].apply(frozenset, axis=1).duplicated()]
1min 9s ± 684 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

这比frozenset方法好100倍。@coldspeed是的,即使排序很快,我仍然记住你的建议,
apply
的效率更低。:-)谢谢太快了!我不得不做一个小改动,因为它提出了:
“索引错误:作为索引器提供的不可对齐的布尔序列(布尔序列的索引和索引对象的索引不匹配)”
,但这样做了:
df[pd.DataFrame(np.sort(df['Name1','Name2']].values,1)).duplicated().values]
get_dummies
为此目的非常创新:)
df=pd.concat([df]*1000000)
%timeit df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]
1.8 s ± 85 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df[pd.DataFrame(np.sort(df[['a','b']].values,1)).duplicated()]
1.26 s ± 19 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit df[~df[['a', 'b']].apply(frozenset, axis=1).duplicated()]
1min 9s ± 684 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)