[코딩테스트]/[Pandas]

[LeetCode - Pandas] (Medium) 178. Rank Scores

잰잰' 2025. 5. 28. 17:12
Table: Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+

id는 이 테이블의 기본 키입니다(고유한 값을 가지는 열).
이 테이블의 각 행은 게임의 점수를 포함하고 있습니다.
점수는 소수점 둘째 자리까지 있는 부동 소수점 값입니다.

 

문제

점수의 순위를 찾는 솔루션을 작성하십시오. 순위는 다음 규칙에 따라 계산되어야 합니다:

점수는 높은 점수에서 낮은 점수 순으로 순위가 매겨져야 합니다.
두 점수가 동일한 경우, 두 점수는 동일한 순위를 가져야 합니다.
동점 이후의 다음 순위 번호는 다음 연속 정수 값이어야 합니다. 다시 말해, 순위 사이에 공백이 있어서는 안 됩니다.
결과 테이블은 점수를 기준으로 내림차순으로 정렬되어 반환되어야 합니다.

결과 형식은 다음 예시와 같습니다.

Example 1:

Input: 
Scores table:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+
Output: 
+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

 

✏️ 풀이

import pandas as pd

def order_scores(scores: pd.DataFrame) -> pd.DataFrame:
    scores['rank'] = scores['score'].rank(method='dense', ascending=False)

    return scores[['score', 'rank']].sort_values(by='score', ascending=False)

 

📚  개념정리

rank() ? 데이터에 순위를 매길 때 사용하는 함수

# 기본 사용법 #

import pandas as pd

s = pd.Series([100, 200, 100, 300])
s.rank()

# 결과 #
0    1.5
1    3.0
2    1.5
3    4.0
dtype: float64

method : 동점자 처리 방식

- average : (기본값) 동점자에게 평균 순위 부여

- min : 동점자에게 가장 낮은 순위 부여

- max : 동점자에게 가장 높은 순위 부여

- first : 먼저 나온 순서대로 순위 부여

- dense : 연속된 순위를 부여, 중복 순위 후에도 순위가 건너뛰지 않음(홀 없음)

 

ascending : 정렬 방향

- 기본값 : True 낮은 값에 낮은 순위

- False로 설정하면 높은 값에 낮은 순위

 

na_option : 결측치 처리

- keep : NaN은 NaN으로 유지 (기본값)

- top : NaN을 가장 높은 순위로 처리

- bottom : NaN을 가장 낮은 순위로 처리