[Pandas] 데이터 순위 구하기(rank)

반응형
    반응형

    데이터프레임 내에서 순위 구하는 방법입니다. 순위도 어찌보면 데이터 정렬을 하는 것입니다. 다만, 데이터를 순위로 변환하고 동점처리를 어떻게 할것인가에 따라 정렬이 달라집니다.

    파라미터는 다음과 같습니다.

    df.rank(axis=0,method='average',ascending=True,..)
    • axis : 0(defualt)는 행, 1은 열을 기준으로 함
    • method : 동점처리 기준, 방법은 average(defualt), min, max, first, dense 으로 5가지가 있음.
    • ascending : True(default) 오름차순을 반영해 순위(가장 작은 값이 1위), False 내림차순을 반영해 순위(가장 큰 값이 1위)

    동점 처리

    순위를 하다보면 동점이 나오는 경우 어떻게 할지 정해야 합니다.

    판다스 rank함수에서는 동점 처리 하는 방법을 총 5가지로 나누고 있습니다.

     

    • 평균('average') : 동점시 그룹내 평균 순위부여
    • 최소값('min') : 동점시 그룹 내 최소 순위 부여
    • 최대값('max') : 동점시 그룹 내 최대 순위 부여
    • 첫번째 값('first') : 동점시 데이터에서 가장 먼저 나타나는 순서대로 순위 부여
    • 조밀('dense') : 최소값처럼 순위를 부여하지만 그룹 간 순위를 1씩 증가시킴.

    예로 확인하겠습니다.
    같은 데이터를 각 순위별로 출력해 합치겠습니다.

    import pandas as pd
    obj = {'Name':['Jucy','Via','Henry','Harry','Andy','Sarah','Rax'], 'Score':[90,80,85,95,90,100,80]}
    df= pd.DataFrame(obj)
    
    df['rank_avg'] = df['Score'].rank(ascending=False)
    df['rank_min'] = df['Score'].rank(method = 'min',ascending=False)
    df['rank_max'] = df['Score'].rank(method='max',ascending=False)
    df['rank_first'] = df['Score'].rank(method='first',ascending=False)
    df['rank_dense'] = df['Score'].rank(method='dense',ascending=False)

    90점과 80점이 같은데 average는 0.5를 더하여 순위를 매겼습니다. min은 부여된 순위 중 낮은 순위, 즉, 90점인 경우 3,4위인데 이중 작은 숫자인 3위를 주었습니다.
    max는 min과 반대로 큰 숫자인 4위를 주었습니다.
    first는 행정렬을 볼 때 Jucy가 Andy보다 위에 있으니 3위를 부여했습니다.
    dense는 동점인 경우 같은 순위를 적용했습니다.

    그룹별로 순위 매기기

    예를 들어 영어과목과 수학과목간에 순위를 매길려면 영어와 수학끼리 묶어서 순위를 매겨야 합니다. 이런 경우 그룹으로 묶은 후(groupby) 순위를 진행합니다.

    수강과목 수학, 영어에 대한 점수를 나눈 데이터를 만들겠습니다.

    from itertools import chain, repeat
    obj = {'Name':['Jucy','Via','Henry','Harry','Andy','Sarah','Rax']*2,'Course':list(chain.from_iterable(repeat(course,7) for course in ['Math','English'])),
           'Score':[70,90,85,95,100,60,90,80,60,100,75,85,95,75]}
    df= pd.DataFrame(obj)
    df

    Course에 따른 Score 순위를 매겨보겠습니다.

    df['rank_avg_group'] = df.groupby('Course')['Score'].rank(method='average',ascending=False)
    df

    판다스 그룹별 랭킹

    Math와 English 그룹별로 rank가 나오게 됩니다.

     

    관련 포스팅

    [Pandas] 데이터프레임 정렬하기(sort_index,sort_values)

    [Pandas] 같은 범주로 묶기(groupby)

    댓글

    Designed by JB FACTORY

    ....