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

Jua*_*uan 17 python sorting dataframe pandas

我在Python中有一个包含3列的数据框:

Name1 Name2 Value
Juan  Ale   1
Ale   Juan  1
Run Code Online (Sandbox Code Playgroud)

并希望根据列Name1和Name2组合消除重复项.

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

Name1 Name2 Value
Juan  Ale   1
Run Code Online (Sandbox Code Playgroud)

任何想法都会非常感激!

WeN*_*Ben 21

通过使用np.sortduplicated

df[pd.DataFrame(np.sort(df[['Name1','Name2']].values,1)).duplicated()]
Out[614]: 
  Name1 Name2  Value
1   Ale  Juan      1
Run Code Online (Sandbox Code Playgroud)

性能

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
Run Code Online (Sandbox Code Playgroud)

  • 这比freezeset方法好100倍. (4认同)
  • @coldspeed是的,即使排序很快就匹配,我仍然记住你的建议,"apply"的效率较低.:-) (2认同)

jpp*_*jpp 18

您可以转换为frozenset并使用pd.DataFrame.duplicated.

res = df[~df[['Name1', 'Name2']].apply(frozenset, axis=1).duplicated()]

print(res)

  Name1 Name2  Value
0  Juan   Ale      1
Run Code Online (Sandbox Code Playgroud)

frozenset是必要的,而不是set因为duplicated使用散列来检查重复.

使用列比使用行更好地扩展.对于大量行,使用@ Wen的基于排序的算法.


raf*_*elc 5

这个问题我很晚才知道,但无论如何都要给我的贡献:)

您还可以使用get_dummiesadd作为创建可哈希行的好方法

df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]
Run Code Online (Sandbox Code Playgroud)

时间不如@Wen的回答,但仍然比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)
Run Code Online (Sandbox Code Playgroud)