복붙노트

[PYTHON] Python (pandas) : 다른 열에 최대 값을 갖는 행을 유지하는 두 개의 열을 기반으로 중복 제거

PYTHON

Python (pandas) : 다른 열에 최대 값을 갖는 행을 유지하는 두 개의 열을 기반으로 중복 제거

두 개의 열 (A와 B)에 따라 중복 된 값을 포함하는 데이터 프레임이 있습니다.

A B C
1 2 1
1 2 4
2 7 1
3 4 0
3 4 8

C 열의 최대 값을 갖는 행을 유지하는 중복을 제거하려고합니다. 이로 인해 다음과 같은 결과가 발생합니다.

A B C
1 2 4
2 7 1
3 4 8

나는 그것을하는 방법을 이해할 수 없다. 내가 drop_duplicates (), 다른 뭔가를 사용해야합니까?

해결법

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

    1.다음을 기준으로 그룹을 사용하여 수행 할 수 있습니다.

    다음을 기준으로 그룹을 사용하여 수행 할 수 있습니다.

    c_maxes = df.groupby(['A', 'B']).C.transform(max)
    df = df.loc[df.C == c_maxes]
    

    c_maxes는 각 그룹에서 C의 최대 값의 계열이지만 길이는 같고 df와 동일한 색인입니다. .transform을 사용하지 않았다면 c_maxes를 어떻게 인쇄하는지 확인하는 것이 좋습니다.

    drop_duplicates를 사용하는 또 다른 접근법은

    df.sort('C').drop_duplicates(subset=['A', 'B'], take_last=True)
    

    어떤 것이 더 효율적인지는 확실치 않지만 정렬을 포함하지 않기 때문에 첫 번째 접근 방식을 추측합니다.

    편집하다: pandas 0.18부터 두 번째 솔루션은 df.sort_values ​​( 'C'). drop_duplicates (부분 집합 [[A ','B '], 유지 ='마지막 ') 또는 df.sort_values ​​('C ' 오름차순 = 거짓) .drop_duplicates (하위 집합 = [ 'A', 'B']). 어쨌든 groupby 솔루션은 훨씬 더 성능이 좋은 것 같습니다.

    %timeit -n 10 df.loc[df.groupby(['A', 'B']).C.max == df.C]
    10 loops, best of 3: 25.7 ms per loop
    
    %timeit -n 10 df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
    10 loops, best of 3: 101 ms per loop
    
  2. ==============================

    2.나는 groupby가 일해야한다고 생각해.

    나는 groupby가 일해야한다고 생각해.

    df.groupby(['A', 'B']).max()['C']
    

    데이터 프레임이 필요하다면 재설정 된 인덱스 호출을 연결할 수 있습니다.

    df.groupby(['A', 'B']).max()['C'].reset_index()
    
  3. ==============================

    3.pandas drop duplicates 함수를 사용하여 간단히이 작업을 수행 할 수 있습니다.

    pandas drop duplicates 함수를 사용하여 간단히이 작업을 수행 할 수 있습니다.

    df.drop_duplicates(['A','B'],keep= 'last')
    
  4. ==============================

    4.원하는대로 drop_duplicates로 할 수 있습니다.

    원하는대로 drop_duplicates로 할 수 있습니다.

    # initialisation
    d = pd.DataFrame({'A' : [1,1,2,3,3], 'B' : [2,2,7,4,4],  'C' : [1,4,1,0,8]})
    
    d = d.sort_values("C", ascending=False)
    d = d.drop_duplicates(["A","B"])
    

    동일한 주문을받는 것이 중요 할 경우

    d = d.sort_index()
    
  5. from https://stackoverflow.com/questions/32093829/pythonpandas-removing-duplicates-based-on-two-columns-keeping-row-with-max-va by cc-by-sa and MIT license