엑셀에 Rank 함수가 있는 것처럼 판다스에도 rank 함수가 존재합니다. 이 함수를 이용하면 수 목록 내에서 개별 수의 크기 순위를 손쉽게 계산할 수 있습니다. 이번에는 rank 함수를 사용하는 방법을 알아보겠습니다.
코드
DataFrame.rank(self,
axis = 0, # 기본값 0(index)으로, index 축을 기준으로 랭크가 계산됩니다.
method = 'average', # 동점을 가진 데이터들의 순위를 매기는 방법입니다.
numeric_only = None, # True로 설정된 경우 숫자 열만 순위를 매깁니다.
na_option = 'keep', # NaN 값 순위를 매기는 방법입니다.
ascending = True, # 오름차순, 내림차순 정렬인지 정합니다.
pct = False) # 반환 된 순위를 백분위 수 형식으로 표시할지 여부입니다.
동점을 가진 데이터의 순위를 정하는 방법
average(평균): 그룹의 평균 순위 부여 (예: 두 명이 공동 1등이라면 둘 다 1.5등으로 처리)
min(최솟값): 그룹에서 가장 낮은 순위 부여 (예: 두 명이 공동 1등이라면 둘 다 1등으로 처리)
max(최댓값): 그룹에서 가장 낮은 순위 부여 (예: 두 명이 공동 1등이라면 둘 다 2등으로 처리)
first(첫 번째): 그룹에서 표시되는 순서대로 순위 부여 (예: 두 명이 공동 1등이라면 순서가 빠른 사람을 1등으로 처리)
dense(밀도): min과 동일함. 다만 순위는 항상 1씩 증가
df = pd.DataFrame(
{'name': ['KIM', 'LEE', 'SMITH','BROWN', 'MILLER'],
'age': [24, 32, 43, 24, np.nan]})
df['rank_average'] = df['age'].rank(method='average')
df['rank_min'] = df['age'].rank(method='min')
df['rank_max'] = df['age'].rank(method='max')
df['rank_first'] = df['age'].rank(method='first')
df['rank_dense'] = df['age'].rank(method='dense')
min의 경우 1등 다음 3등이 나타나지만, dense의 경우 1등 다음에 2등이 나타나는 것을 볼 수 있습니다.
오름차순/내림차순 정렬하기
rank 함수는 기본적으로 오름차순 정렬을 합니다. ascending=False를 입력하면 내림차순 정렬을 할 수 있습니다.
df = pd.DataFrame(
{'name': ['KIM', 'LEE', 'SMITH','BROWN', 'MILLER'],
'age': [24, 32, 43, 24, np.nan]})
df['rank_average'] = df['age'].rank(method='min', ascending=False)
df
"""
name age rank_average
0 KIM 24.0 3.0
1 LEE 32.0 2.0
2 SMITH 43.0 1.0
3 BROWN 24.0 3.0
4 MILLER NaN NaN
"""
NaN 값 순위를 매기는 방법
keep(유지): 기본 값으로 NaN의 순위에 NaN을 부여
top(가장 높은 순위): 그룹에서 가장 높은 순위 부여
bottom(가장 낮은 순위): 그룹에서 가장 높은 순위 부여
분석 목적에 따라서는 애초에 데이터에서 삭제하는 편이 나을 수도 있습니다.
df = pd.DataFrame(
{'name': ['KIM', 'LEE', 'SMITH','BROWN', 'MILLER'],
'age': [24, 32, 43, 24, np.nan]})
df['rank_average'] = df['age'].rank(method='min', ascending=False, na_option='top')
df
"""
name age rank_average
0 KIM 24.0 4.0
1 LEE 32.0 3.0
2 SMITH 43.0 2.0
3 BROWN 24.0 4.0
4 MILLER NaN 1.0
"""
-이 글은 아나콘다(Anaconda3)가 설치된 환경을 기준으로 작성되었습니다.