簡體   English   中英

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.sortduplicated

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_dummiesadd一個創建可哈希行的好方法

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM