新聞中心
本文轉(zhuǎn)載自微信公眾號「AI入門學(xué)習(xí)」,作者小伍哥 。轉(zhuǎn)載本文請聯(lián)系A(chǔ)I入門學(xué)習(xí)公眾號。

邵武ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
所謂的排名,就是一組數(shù)據(jù),我們想要知道每一條數(shù)據(jù)在整體中的名次,需要的是輸出名次,并不改變原數(shù)據(jù)結(jié)構(gòu)。
排序會改變原來的數(shù)據(jù)結(jié)構(gòu),且不會返回名次,這一點區(qū)別需要弄明白。初學(xué)的時候容易弄混淆。
本文將通過一個實例,講清楚Pandas中rank()排名函數(shù)的應(yīng)用。下面是案例數(shù)據(jù),包括我、張三以及唐宋八大家的語文考試成績。
- import pandas as pd
- data = pd.DataFrame({'班級':['1班','1班','1班','1班','1班','2班','2班','2班','2班','2班'],
- '姓名':['韓愈','柳宗元','歐陽修','蘇洵','蘇軾','蘇轍','曾鞏','王安石','張三','小伍哥'],
- '成績':[80,70,70,40,10,60,60,50,50,40]})
- #姓名長度不一樣的,加個符號調(diào)整下,這該死的強迫癥
- data['姓名'] = data['姓名'].str.rjust(3,'〇')
一、DataFrame的正常排名
Pandas中的排名,函數(shù)為rank(),使用也比較簡單,需要注意的是各種排名的差異,需要進行充分理解,這樣在實際應(yīng)用中才不會出錯。
函數(shù)用法:
- DataFrame.rank(axis=0,method='average',numeric_only=None,
- na_option='keep',ascending=True,pct=False)
參數(shù)說明:
axis:0或'index',1或'columns',默認(rèn)0,沿著行或列計算排名
method:'average','min','max','first','dense',默認(rèn)為'average',如何對具有相同值(即ties)的記錄組進行排名:
- average:組的平均等級
- min:組中最低的排名
- max:組中最高等級
- first : 按排列順序排列,依次排列
- dense:類似于 ‘min’,但組之間的排名始終提高1
numeric_only:bool,是否僅僅計算數(shù)字型的columns,布爾值
na_option:{'keep','top','bottom'},默認(rèn)為'keep',NaN值是否參與排名及如何排名
- keep:將NaN等級分配給NaN值
- top:如果升序,則將最小等級分配給NaN值
- bottom:如果升序,則將最高等級分配給NaN值。
ascending:bool,默認(rèn)為True,元素是否應(yīng)該按升序排名。
pct:bool,默認(rèn)為False,是否以百分比形式顯示返回的排名。
所有的參數(shù)中,最核心的參數(shù)是method,一共5種排名方法,下面對這5種方法進行對比,應(yīng)用的時候更好的去選擇。
1、method='first'
當(dāng)method='first'時,當(dāng)里兩個人的分?jǐn)?shù)相同時,分?jǐn)?shù)相同的情況下,誰先出現(xiàn)誰的排名靠前(當(dāng)method取值為min,max,average時,都是要參考“順序排名”的),表中的柳宗元和歐陽修分?jǐn)?shù)相同,但是柳宗元在表格的前面,所以排名第2,歐陽修排名第3。
|
班級 |
姓名 |
成績 |
成績(method='first') |
|
1班 |
〇韓愈 |
50 |
1 |
|
1班 |
柳宗元 |
30 |
2 |
|
1班 |
歐陽修 |
30 |
3 |
|
1班 |
〇蘇洵 |
20 |
4 |
|
1班 |
〇蘇軾 |
10 |
5 |
代碼如下:
- #為了簡化,我們只選擇1班的成績來看
- data_1 = data[data['班級']=='1班']
- data_1['成績_first'] = data_1['成績'].rank(method='first',ascending=False)
- data_1
- 班級 姓名 成績 成績_first
- 0 1班 〇韓愈 50 1.0
- 1 1班 柳宗元 30 2.0
- 2 1班 歐陽修 30 3.0
- 3 1班 〇蘇洵 20 4.0
- 4 1班 〇蘇軾 10 5.0
2、method='min'
當(dāng)method='min'時,成績相同的同學(xué),取在順序排名中最小的那個排名作為該值的排名,會出現(xiàn)名次跳空,柳宗元和歐陽修分?jǐn)?shù)相同,在上面的排名中,分別排第2、第3,所以這里取兩個中最小的為排名名次2作為共同的名次。
|
班級 |
姓名 |
成績 |
成績(method='min') |
|
1班 |
〇韓愈 |
50 |
1 |
|
1班 |
柳宗元 |
30 |
2 |
|
1班 |
歐陽修 |
30 |
2 |
|
1班 |
〇蘇洵 |
20 |
4 |
|
1班 |
〇蘇軾 |
10 |
5 |
代碼如下:
- data_1 = data[data['班級']=='1班']
- data_1['成績_min'] = data_1['成績'].rank(method='min',ascending=False)
- data_1
- 班級 姓名 成績 成績_min
- 0 1班 〇韓愈 50 1.0
- 1 1班 柳宗元 30 2.0
- 2 1班 歐陽修 30 2.0
- 3 1班 〇蘇洵 20 4.0
- 4 1班 〇蘇軾 10 5.0
3、method='max'
當(dāng)method='max'時,與上面的min相反,成績相同的同學(xué),取在順序排名中最大的那個排名作為該值的排名,,會出現(xiàn)名次跳空,柳宗元和歐陽修分?jǐn)?shù)相同,在順序排名中,分別排第2、第3,所以這里取兩個中最大的為排名名次3作為共同的名次。
|
班級 |
姓名 |
成績 |
成績_max |
|
1班 |
〇韓愈 |
50 |
1 |
|
1班 |
柳宗元 |
30 |
3 |
|
1班 |
歐陽修 |
30 |
3 |
|
1班 |
〇蘇洵 |
20 |
4 |
|
1班 |
〇蘇軾 |
10 |
5 |
代碼如下:
- data_1 = data[data['班級']=='1班']
- data_1['成績_max'] = data_1['成績'].rank(method='max',ascending=False)
- data_1
- 班級 姓名 成績 成績_max
- 0 1班 〇韓愈 50 1.0
- 1 1班 柳宗元 30 3.0
- 2 1班 歐陽修 30 3.0
- 3 1班 〇蘇洵 20 4.0
- 4 1班 〇蘇軾 10 5.0
4、method='dense'
method='dense',dense是稠密的意思,即相同成績的同學(xué)排名相同,其他依次加1即可,不會出現(xiàn)名次跳空的情況。柳宗元和歐陽修分?jǐn)?shù)相同,在上面的排名中,分別排第2、第3,取相同排名2,這個看上去和min一樣的,但是下一名的排名發(fā)生了變化,〇蘇洵同學(xué)從第4名排到了第3名,排名數(shù)字連續(xù)的,沒有跳躍。
|
班級 |
姓名 |
成績 |
成績_dense |
|
1班 |
〇韓愈 |
50 |
1 |
|
1班 |
柳宗元 |
30 |
2 |
|
1班 |
歐陽修 |
30 |
2 |
|
1班 |
〇蘇洵 |
20 |
3 |
|
1班 |
〇蘇軾 |
10 |
4 |
代碼如下:
- data_1 = data[data['班級']=='1班']
- data_1['成績_dense'] = data_1['成績'].rank(method='dense',ascending=False)
- data_1
- 班級 姓名 成績 成績_dense
- 0 1班 〇韓愈 50 1.0
- 1 1班 柳宗元 30 2.0
- 2 1班 歐陽修 30 2.0
- 3 1班 〇蘇洵 20 3.0
- 4 1班 〇蘇軾 10 4.0
5、method='average'
當(dāng)method='average'或者默認(rèn)值時,成績相同時,取順序排名中所有名次之和除以該成績的個數(shù),即為該成績的名次;比如上述排名中,30排名為2,3,那么 30的排名 = (2+3)/2=2.5,成績?yōu)?0的同學(xué)只有1個,且排名為1,那50的排名就位1/1=1。
|
班級 |
姓名 |
成績 |
成績_average |
|
1班 |
〇韓愈 |
50 |
1 |
|
1班 |
柳宗元 |
30 |
2.5 |
|
1班 |
歐陽修 |
30 |
2.5 |
|
1班 |
〇蘇洵 |
20 |
4 |
|
1班 |
〇蘇軾 |
10 |
5 |
代碼如下:
- data_1 = data[data['班級']=='1班']
- data_1['成績_average'] = data_1['成績'].rank(method='average',ascending=False)
- data_1
- 班級 姓名 成績 成績_average
- 0 1班 〇韓愈 50 1.0
- 1 1班 柳宗元 30 2.5
- 2 1班 歐陽修 30 2.5
- 3 1班 〇蘇洵 20 4.0
- 4 1班 〇蘇軾 10 5.0
綜合上面的所有排名類型類型整體對比看看:


咨詢
建站咨詢
