복붙노트

[PYTHON] Python - 두 개의 열 조합을 기반으로 데이터 프레임에서 중복을 삭제 하시겠습니까?

PYTHON

Python - 두 개의 열 조합을 기반으로 데이터 프레임에서 중복을 삭제 하시겠습니까?

파이썬에서 3 열의 데이터 프레임이 있습니다.

Name1 Name2 Value
Juan  Ale   1
Ale   Juan  1

이름 1과 이름 2의 열을 기반으로 중복을 제거하고자합니다.

내 예제에서는 두 행이 동일하지만 (다른 순서로 있음) 두 번째 행을 삭제하고 첫 번째 행만 유지하므로 최종 결과는 다음과 같아야합니다.

Name1 Name2 Value
Juan  Ale   1

어떤 아이디어가 정말 감사하겠습니다!

해결법

  1. ==============================

    1.frozenset으로 변환하여 pd.DataFrame.duplicated를 사용할 수 있습니다.

    frozenset으로 변환하여 pd.DataFrame.duplicated를 사용할 수 있습니다.

    res = df[~df[['Name1', 'Name2']].apply(frozenset, axis=1).duplicated()]
    
    print(res)
    
      Name1 Name2  Value
    0  Juan   Ale      1
    

    duplicate는 해시를 사용하여 중복을 확인하기 때문에 set 대신에 frozenset이 필요합니다.

    행보다 열의 확장 성이 좋습니다. 행 수가 많은 경우 @ Wen의 정렬 기반 알고리즘을 사용하십시오.

  2. ==============================

    2.중복 된 np.sort 사용

    중복 된 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
    
  3. ==============================

    3.이 질문에 대해 다소 늦은 것 같지만 어쨌든 내 기부를 해주십시오. :)

    이 질문에 대해 다소 늦은 것 같지만 어쨌든 내 기부를 해주십시오. :)

    get_dummies를 사용하여 해시 가능한 행을 만드는 좋은 방법을 추가 할 수도 있습니다.

    df[~(pd.get_dummies(df.a).add(pd.get_dummies(df.b), fill_value=0)).duplicated()]
    

    시간은 @ 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)
    
  4. from https://stackoverflow.com/questions/51182228/python-delete-duplicates-in-a-dataframe-based-on-two-columns-combinations by cc-by-sa and MIT license