我有一个Python中包含3列的dataframe:
Name1 Name2 Value
Juan Ale 1
Ale Juan 1
并且希望消除基于列Name1和Name2组合的重复项。
在我的示例中,两行相等(但它们的顺序不同),我想删除第二行,只保留第一行,因此最终结果应该是:
Name1 Name2 Value
Juan Ale 1
任何想法都会非常感谢!
发布于 2018-07-05 09:16:07
您可以转换为frozenset
并使用pd.DataFrame.duplicated
。
res = df[~df[['Name1', 'Name2']].apply(frozenset, axis=1).duplicated()]
print(res)
Name1 Name2 Value
0 Juan Ale 1
frozenset
是必需的,而不是set
,因为duplicated
使用散列来检查重复项。
与行相比,列的伸缩性更好。对于大量的行,使用@Wen的基于排序的算法。
发布于 2018-07-05 09:49:23
通过在duplicated
中使用np.sort
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
https://stackoverflow.com/questions/51182228
复制相似问题