반응형
데이터 분석을 처리하다보면 정렬을 하는 경우도 필요하고, 정렬에 대한 그룹별 순위를 구하는 것 또한 필요하다.
그럴때 자주 사용되는 함수가 바로 rank() 함수이다.
rank 함수는 아래와 같은 형식으로 사용한다.
pd.Series.rank(method = 'average', ascending = True)
위와 같이 rank를 사용하는 경우, 두개의 중요한 옵션이 있다.
1) 동점을 처리하는 방법 2) 오름차순/내림차순 유무 이다.
순위를 구할 때 동점 처리하는 방법은 아래와 같다.
- method = 'average' : 동점 관측치일 때 그룹 내 평균 순위를 부여(default)
- method = 'min' : 동점 관측치일 때 그룹 내 최소 순위 부여
- method = 'max' : 동점 관측치일 때 그룹 내 최대 순위 부여
- method = 'first' : 동점 관측치일 때 데이터 상에서 먼저 나타나는 관측치부터 순위 부여
- method = 'dense' : 동점 관측치일 때 그룹 내 최소 순위를 부여하나, 순위가 1씩 증가함
순위를 오름차순/내림차순으로 구하는 방법은 아래와 같다.
- ascending = True : 오름차순으로 정렬(default)
- ascending = False : 내림차순으로 정렬
예제
import numpy as np
import pandas as pd
df = pd.DataFrame({
'name': ['kim', 'lee', 'park', 'choi', 'jung', 'gang', 'nam'],
'score': [70, 95, 100, 95, 70, 90, 70]
}, columns=['name', 'score'])
df
>>>
name score
0 kim 70
1 lee 95
2 park 100
3 choi 95
4 jung 70
5 gang 90
6 nam 70
## 출처: https://rfriend.tistory.com/461 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]
## 순위 구하기
df['rank_by_av'] = df['score'].rank() # method = 'average', ascending = True
df['rank_by_min_desc'] = df['score'].rank(method = 'min', ascending = False) # 동점이 나왔을 때 최소순의 부여, 내림차순
df
>>>
name score rank_by_av rank_by_min_desc
0 kim 70 2.0 5.0
1 lee 95 5.5 2.0
2 park 100 7.0 1.0
3 choi 95 5.5 2.0
4 jung 70 2.0 5.0
5 gang 90 4.0 4.0
6 nam 70 2.0 5.0
그룹별로 순위를 구할 때에는 아래와 같이 작성해주면 된다.
df.groupby(column name).rank()
## 그룹별 순위 구하기
from itertools import chain, repeat
df2 = pd.DataFrame({'name': ['kim', 'lee', 'park', 'choi']*3,
'course': list(chain.from_iterable((repeat(course, 4)
for course in ['korean', 'english', 'math']))),
'score': [70, 95, 100, 95, 65, 80, 95, 90, 100, 85, 90, 90]
}, columns=['name', 'course', 'score'])
df2
>>>>
name course score
0 kim korean 70
1 lee korean 95
2 park korean 100
3 choi korean 95
4 kim english 65
5 lee english 80
6 park english 95
7 choi english 90
8 kim math 100
9 lee math 85
10 park math 90
11 choi math 90
df2['rank_by_min_per_course'] = df2.groupby('course')['score'].rank(method='min', ascending=False)
df2
>>>
name course score rank_by_min_per_course
0 kim korean 70 4.0
1 lee korean 95 2.0
2 park korean 100 1.0
3 choi korean 95 2.0
4 kim english 65 4.0
5 lee english 80 3.0
6 park english 95 1.0
7 choi english 90 2.0
8 kim math 100 1.0
9 lee math 85 4.0
10 park math 90 2.0
11 choi math 90 2.0
참고 :
[Python pandas] DataFrame, Series에서 순위(rank)를 구하는 rank() 함수
이번 포스팅에서는 Python pandas의 DataFrame, Series 에서 특정 변수를 기준으로 순서를 구할 때 사용하는 rank() 함수를 소개하겠습니다. 순위(Rank)는 정렬(Sort)와 밀접한 관련이 있는데요, 참고로 Python
rfriend.tistory.com
반응형
'Programming > Python' 카테고리의 다른 글
[Python] Numpy Float(소수) 출력 표현 설정하기 (0) | 2021.03.23 |
---|---|
[Python] python 에서 이유를 알 수 없는 GPU 에러 정리(device-side assert triggered) (0) | 2021.02.04 |
[Python] 파이썬 파일 크기 사이즈 구하기 - os.path.getsize() (0) | 2021.01.12 |
[Python] 폴더 내 파일 리스트 가져오기 (os/glob) (0) | 2021.01.12 |
[Python] pytorch 모델 저장하기 - state_dict() (0) | 2021.01.06 |