![](/img/trans.png)
[英]How to return a dataframe of number of duplicates based on filtering the two columns in python
[英]Python - Delete duplicates in a dataframe based on two columns combinations?
我在Python中有一个包含3列的数据框:
Name1 Name2 Value
Juan Ale 1
Ale Juan 1
并希望消除基于Name1和Name2列组合的重复项。
在我的示例中,两行相等(但是顺序不同),我想删除第二行并保留第一行,因此最终结果应为:
Name1 Name2 Value
Juan Ale 1
任何想法将不胜感激!
通过使用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
您可以转换为frozenset
并使用pd.DataFrame.duplicated
。
res = df[~df[['Name1', 'Name2']].apply(frozenset, axis=1).duplicated()]
print(res)
Name1 Name2 Value
0 Juan Ale 1
因为duplicated
使用散列来检查重复项,所以无需使用frozenset
而不是set
。
列比行更好地缩放。 对于大量行,请使用@Wen的基于排序的算法。
这个问题我很晚才知道,但无论如何都要给我的贡献:)
您还可以使用get_dummies
并add
一个创建可哈希行的好方法
df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]
时间不如frozen_set
的答案,但是它仍然比apply
+ frozen_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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.