日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【Python】Pandas中的宝藏函数-rank()

發(fā)布時間:2025/3/12 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Python】Pandas中的宝藏函数-rank() 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

所謂的排名,就是一組數(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',默認0,沿著行或列計算排名

method:'average','min','max','first','dense',默認為'average',如何對具有相同值(即ties)的記錄組進行排名:

  • average:組的平均等級

  • min:組中最低的排名

  • max:組中最高等級

  • first : 按排列順序排列,依次排列

  • dense:類似于 ‘min’,但組之間的排名始終提高1

numeric_only:bool,是否僅僅計算數(shù)字型的columns,布爾值

na_option:{'keep','top','bottom'},默認為'keep',NaN值是否參與排名及如何排名

  • keep:將NaN等級分配給NaN值

  • top:如果升序,則將最小等級分配給NaN值

  • bottom:如果升序,則將最高等級分配給NaN值。

ascending:bool,默認為True,元素是否應(yīng)該按升序排名。

pct:bool,默認為False,是否以百分比形式顯示返回的排名。

所有的參數(shù)中,最核心的參數(shù)是method,一共5種排名方法,下面對這5種方法進行對比,應(yīng)用的時候更好的去選擇。

1、method='first'

當method='first'時,當里兩個人的分數(shù)相同時,分數(shù)相同的情況下,誰先出現(xiàn)誰的排名靠前(當method取值為min,max,average時,都是要參考“順序排名”的),表中的柳宗元和歐陽修分數(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'

當method='min'時,成績相同的同學(xué),取在順序排名中最小的那個排名作為該值的排名,會出現(xià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'

當method='max'時,與上面的min相反,成績相同的同學(xué),取在順序排名中最大的那個排名作為該值的排名,,會出現(xià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)名次跳空的情況。柳宗元和歐陽修分數(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'

當method='average'或者默認值時,成績相同時,取順序排名中所有名次之和除以該成績的個數(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

綜合上面的所有排名類型類型整體對比看看

班級

姓名

成績

rank

rank_min

rank_max

rank_first

rank_dense

1班

〇韓愈

50

1

1

1

1

1

1班

柳宗元

30

2.5

2

3

2

2

1班

歐陽修

30

2.5

2

3

3

2

1班

〇蘇洵

20

4

4

4

4

3

1班

〇蘇軾

10

5

5

5

5

4

data_1 = data[data['班級']=='1班'] data_1['rank'] = data_1['成績'].rank(ascending=False) data_1['rank_min'] = data_1['成績'].rank(method='min',ascending=False) data_1['rank_max'] = data_1['成績'].rank(method='max',ascending=False) data_1['rank_first'] = data_1['成績'].rank(method='first',ascending=False) data_1['rank_dense'] = data_1['成績'].rank(method='dense',ascending=False) data_1班級 姓名 成績 rank rank_min rank_max rank_first rank_dense 0 1班 〇韓愈 50 1.0 1.0 1.0 1.0 1.0 1 1班 柳宗元 30 2.5 2.0 3.0 2.0 2.0 2 1班 歐陽修 30 2.5 2.0 3.0 3.0 2.0 3 1班 〇蘇洵 20 4.0 4.0 4.0 4.0 3.0 4 1班 〇蘇軾 10 5.0 5.0 5.0 5.0 4.0

其他參數(shù)都比較簡單了,計算一行的排名,axis=0即可。

參數(shù)pct=True時,返回排名的分位數(shù),可以用于計算排名的百分比,非常方便。

data_1?=?data[data['班級']=='1班'] data_1['成績_first']?=?data_1['成績'].rank(method='first', ascending=False, pct=True) data_1 班級 姓名 成績 成績_first 0 1班 〇韓愈 80 0.2 1 1班 柳宗元 70 0.4 2 1班 歐陽修 70 0.6 3 1班 〇蘇洵 40 0.8 4??1班??〇蘇軾??10???????1.0

二、DataFrame的分組排名

在上文中,我們看到了rank()函數(shù)對DataFrame直接排名,非常方便,也非常豐富,當然,rank()也可以對經(jīng)過groupby分組后的數(shù)據(jù)進行排名,分組排名的功能,讓數(shù)據(jù)分析更加的精細化,大大提高分析效率。直接使用開頭創(chuàng)建好的數(shù)據(jù)集,按班級排名,看看乜咯班級的第一名是誰。

data['成績_dense']= data.groupby('班級')['成績'].rank(method='dense') data 班級 姓名 成績 成績_dense 0 1班 〇韓愈 50 4.0 1 1班 柳宗元 30 3.0 2 1班 歐陽修 30 3.0 3 1班 〇蘇洵 20 2.0 4 1班 〇蘇軾 10 1.0 5 2班 〇蘇轍 60 3.0 6 2班 〇曾鞏 60 3.0 7 2班 王安石 50 2.0 8 2班 〇張三 50 2.0 9 2班 小伍哥 40 1.0

同上面的直接排名,method一樣的可以使用各種方法,達到各種排名的目的。

data['成績_average']= data.groupby('班級')['成績'].rank(method='average') data班級 姓名 成績 成績_average 0 1班 〇韓愈 80 5.0 1 1班 柳宗元 70 3.5 2 1班 歐陽修 70 3.5 3 1班 〇蘇洵 40 2.0 4 1班 〇蘇軾 10 1.0 5 2班 〇蘇轍 60 4.5 6 2班 〇曾鞏 60 4.5 7 2班 王安石 50 2.5 8 2班 〇張三 50 2.5 9 2班 小伍哥 40 1.0

三、Series的排名

對于Series。其實就是數(shù)據(jù)框的一列,沒啥多說的,一樣的方法就行,下面寫了兩個簡單的示例,大家參考下。

from pandas import Series s = Series([1,3,2,1,6]) s.rank() a 1.5 c 4.0 d 3.0 b 1.5 e 5.0

?

根據(jù)值在數(shù)組中出現(xiàn)的順序進行排名,method='first'

s.rank(method='first') a 1.0 c 4.0 d 3.0 b 2.0 e 5.0

根據(jù)值在數(shù)組中出現(xiàn)的順序密集排名,method='dense'

s.rank(method='dense') a 1.0 c 3.0 d 2.0 b 1.0 e 4.0

?

碼字不易,大家多多分享傳播。求個點贊+在看

往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯黃海廣老師《機器學(xué)習(xí)課程》視頻課 本站qq群851320808,加入微信群請掃碼:

總結(jié)

以上是生活随笔為你收集整理的【Python】Pandas中的宝藏函数-rank()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 先锋影音资源av | 中文在线а√天堂官网 | 少妇影院在线观看 | 国产成人精品免高潮在线观看 | 久久精品一二区 | 波多野结衣日韩 | 黄页网站视频 | 狠狠干,狠狠操 | 免费国产一区 | 日韩裸体视频 | www.好了av.com| 久久亚洲国产成人精品性色 | 一级欧美视频 | 可以免费看的av网站 | 暧暧视频在线观看 | 真实偷拍激情啪啪对白 | 青青草国产在线播放 | 特级做a爰片毛片免费69 | 日韩欧美国产一区二区 | 樱桃av | 曰韩毛片 | 免费的黄色片 | 婷婷中文在线 | 国产精品自拍亚洲 | 日本电影一区二区三区 | jiizzyou欧美2| 久久精品无码中文字幕 | 一卡二卡精品 | 日本女优网址 | 日日骑| 99久久99久久精品国产片果冻 | 亚洲欧洲色图 | 久久久久久久久久久久电影 | 欧美日韩黄 | 欧美黄色性视频 | 中文字幕亚洲一区二区三区 | 老司机狠狠爱 | 999免费视频| 福利一区三区 | 精品国产av一区二区三区 | www.亚洲一区二区三区 | jizjiz中国少妇高潮水多 | 7色av | 岛国片在线免费观看 | 又大又粗欧美黑人aaaaa片 | 国产字幕在线观看 | 欧美视频第一页 | 无码视频一区二区三区 | 麻豆电影网站 | 韩国一区二区在线播放 | 亚欧美在线| 色小姐av| 影音先锋亚洲天堂 | 国产在线视频自拍 | 天堂a√在线 | 欧美成视频 | 日韩一区二区三 | 国产乱国产 | 国产精品女人久久久 | 亚洲综合在线一区二区 | 国内毛片毛片毛片毛片毛片 | 欧美贵妇videos办公室 | 2019中文字幕在线 | 日韩精品在线第一页 | 不卡免费视频 | 国产精品久久77777 | 国产激情对白 | 亚洲影视网 | www 在线观看视频 | 性xxxx18| 校园春色综合网 | 一级空姐毛片 | 在线观看免费成人 | 无码 制服 丝袜 国产 另类 | jjzz日本视频 | 噜噜噜av | 人人妻人人澡人人爽人人dvd | 一极黄色大片 | 欧美www.| 亚洲小说区图片区都市 | 中文字幕在线播放一区 | 神马久久久久久久久久久 | 真人一及毛片 | 岛国免费视频 | 女人扒开屁股让男人捅 | 想要xx在线观看 | 天天色影| 久久涩综合 | 射一射| 中文在线а√在线 | 操一操干一干 | 97福利网| 国产精品美女主播 | 日本丰满大乳奶做爰 | 日本久久免费 | 五月天丁香婷 | 五月天精品在线 | 不卡中文字幕在线 | 色噜噜网站 |