題目:
表:?
Scores
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | score | decimal | +-------------+---------+ 在 SQL 中,id 是該表的主鍵。 該表的每一行都包含了一場比賽的分數。Score 是一個有兩位小數點的浮點值。查詢并對分數進行排序。排名按以下規則計算:
- 分數應按從高到低排列。
- 如果兩個分數相等,那么兩個分數的排名應該相同。
- 在排名相同的分數后,排名數應該是下一個連續的整數。換句話說,排名之間不應該有空缺的數字。
按?
score
?降序返回結果表。查詢結果格式如下所示。
來源:力扣(LeetCode)
鏈接:力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺
示例:
示例 1:
輸入:
Scores 表: +----+-------+ | id | score | +----+-------+ | 1 | 3.50 | | 2 | 3.65 | | 3 | 4.00 | | 4 | 3.85 | | 5 | 4.00 | | 6 | 3.65 | +----+-------+
輸出:+-------+------+ | score | rank | +-------+------+ | 4.00 | 1 | | 4.00 | 1 | | 3.85 | 2 | | 3.65 | 3 | | 3.65 | 3 | | 3.50 | 4 | +-------+------+
解法:
先對score列降序排序,接著刪除id列,然后使用rank函數排名。
知識點:
1.DataFrame.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False):計算出axis方向上各個data的排名。axis:默認按沿著index方向排名;method有以下選擇:
‘average’:默認,在每個組中分配平均排名(組,相同的值就是一個組,下同);
‘min’:對整個組使用最小排名;
‘max’:對整個組使用最大排名;
‘first’:按照值在數據中出現的次序分配排名;
‘dense’:類似于‘min’,但是組間排名總是增加1,而不是一個組中的相等元素的數量;
numeric_only:是否只對數值列處理;na_option:用于處理NaN值,'keep':保持NA;'top':升序時給NaN分配最小值;'bottom':升序時給NaN分配最大值;ascending:是否為升序,默認為True;pct:是否為百分數。舉例,初始表如下,存在r:
r['rank'] = r.rank(method='dense', ascending=False)
代碼:
import pandas as pddef order_scores(scores: pd.DataFrame) -> pd.DataFrame:r = scores.sort_values(['score'], ascending=False, ignore_index=True)del r['id']r['rank'] = r.rank(method='dense', ascending=False)return r