Pandas 排序和排名操作
1. 前言
上一小節(jié),我們學(xué)習(xí)了 Pandas 庫(kù)對(duì)于多個(gè)數(shù)據(jù)集的連接和合并操作,滿足了我們?cè)跀?shù)據(jù)行和列上的內(nèi)容擴(kuò)展需要,除了這點(diǎn),我們很多時(shí)候也需要對(duì)某個(gè)數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行排序操作,按照遞增或者遞減的方式將數(shù)據(jù)依據(jù)某個(gè)條件進(jìn)行排序,Pandas 庫(kù)針對(duì)這樣一個(gè)較為常見(jiàn)的數(shù)據(jù)處理需求,又提供了怎樣的操作方式呢?
本節(jié)我們將一起學(xué)習(xí) Pandas 庫(kù)中對(duì)于數(shù)據(jù)的排序操作,分為按索引排序和按數(shù)據(jù)值進(jìn)行排序,除了排序功能,Pandas 還提供了排名的操作,接下來(lái)我們一起學(xué)習(xí) Pandas 庫(kù)的排序和排名操作吧。
2. Pandas 排序操作
Pandas 對(duì)于排序的操作分為按索引排序和按數(shù)據(jù)值排序,分別通過(guò)函數(shù) sort_index () 和 sort_values () 進(jìn)行實(shí)現(xiàn),接下來(lái)我們?cè)敿?xì)學(xué)習(xí)每個(gè)函數(shù)的使用方式。首先我們通過(guò) Excel 進(jìn)行數(shù)據(jù)的解析。
Pandas 解析的數(shù)據(jù)對(duì)象 data 具體內(nèi)容如下:
# 導(dǎo)入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第15小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 data 數(shù)據(jù)對(duì)象 ---
BB AA CC EE DD
0 11 3 3230.0 45.6 20.0
1 4 2 2124.0 67.0 NaN
2 7 23 345.0 33.9 23.0
3 5 11 2361.0 59.5 4.0
4 10 45 326.0 69.9 55.0
5 33 33 NaN 75.0 67.0
2.1 sort_index () 函數(shù)
該函數(shù)是對(duì)數(shù)據(jù)集進(jìn)行按索引進(jìn)行排序時(shí)使用的,里面提供了豐富的函數(shù),下面我將列舉幾個(gè)常用的參數(shù)。
df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
參數(shù)名 | 說(shuō)明 |
---|---|
axis | 排序的索引軸,axis=0 行索引(默認(rèn)),axis=1 列索引 |
ascending | ascending=True 升序或是 ascending=False 降序排序 |
下面我們將通過(guò)上面從 Excel 解析的數(shù)據(jù)集 data 進(jìn)行該函數(shù)這個(gè)參數(shù)的代碼演示:
# data 為上面從 Excel 中解析出來(lái)的數(shù)據(jù)
# 1.按行索引進(jìn)行降序排列 axis=0,ascending=False
data_res=data.sort_index(axis=0,ascending=False)
print(data_res)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
5 33 33 NaN 75.0 67.0
4 10 45 326.0 69.9 55.0
3 5 11 2361.0 59.5 4.0
2 7 23 345.0 33.9 23.0
1 4 2 2124.0 67.0 NaN
0 11 3 3230.0 45.6 20.0
# 結(jié)果解析:通過(guò)對(duì)這兩個(gè)參數(shù)的設(shè)置,我們按照行索引進(jìn)行了降序排列。
# 2.按列索引進(jìn)行降序排列 axis=1,ascending=False
data_res=data.sort_index(axis=1,ascending=False)
print(data_res)
# --- 輸出結(jié)果 ---
EE DD CC BB AA
0 45.6 20.0 3230.0 11 3
1 67.0 NaN 2124.0 4 2
2 33.9 23.0 345.0 7 23
3 59.5 4.0 2361.0 5 11
4 69.9 55.0 326.0 10 45
5 75.0 67.0 NaN 33 33
# 結(jié)果解析:通過(guò)設(shè)置按照列索引,進(jìn)行降序排列數(shù)據(jù),可以看到輸出結(jié)果。
# 3.按列索引進(jìn)行降序排列 axis=1,ascending=True
data_res=data.sort_index(axis=1,ascending=True)
print(data_res)
# --- 輸出結(jié)果 ---
AA BB CC DD EE
0 3 11 3230.0 20.0 45.6
1 2 4 2124.0 NaN 67.0
2 23 7 345.0 23.0 33.9
3 11 5 2361.0 4.0 59.5
4 45 10 326.0 55.0 69.9
5 33 33 NaN 67.0 75.0
# 結(jié)果解析:通過(guò)設(shè)置按照列索引進(jìn)行升序排列數(shù)據(jù),可以看到列數(shù)據(jù)的索引順序變?yōu)榱藦?AA 到 EE 。
2.2 sort_values () 函數(shù)
該函數(shù)是專(zhuān)門(mén)用于數(shù)據(jù)集進(jìn)行數(shù)據(jù)值的排序使用,下面同樣我列舉了他常用的一些參數(shù)設(shè)置。
pd.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
參數(shù)名 | 說(shuō)明 |
---|---|
by | 指定需要排序的列或者行 |
axis | 指定需要排序的是列還是行,默認(rèn) axis=0 表示行 |
ascending | 設(shè)置升序還是降序,默認(rèn)是 ascending=True 為升序 |
na_position | 設(shè)置缺失值顯示的位置,有 first 和 last 兩個(gè)值,默認(rèn)是 last |
下面我們利用前面解析出來(lái) data 數(shù)據(jù)集,進(jìn)行各參數(shù)詳細(xì)的設(shè)置使用。
# data 為上面從 Excel 中解析出來(lái)的數(shù)據(jù)
# 1.按 AA 列進(jìn)行 行數(shù)據(jù)的 升序 排序
data_res=data.sort_values(by=["AA"],ascending=True,axis=0)
print(data_res)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
1 4 2 2124.0 67.0 NaN
0 11 3 3230.0 45.6 20.0
3 5 11 2361.0 59.5 4.0
2 7 23 345.0 33.9 23.0
5 33 33 NaN 75.0 67.0
4 10 45 326.0 69.9 55.0
# 結(jié)果解析:我們這里通過(guò) by 參數(shù)設(shè)置了是以 AA 列為標(biāo)準(zhǔn),進(jìn)行 axis=0 行數(shù)據(jù)的 ascending=True 升序排序,可以看到 AA 列數(shù)據(jù)分別為 2,3,11,23,33,45,以此為標(biāo)準(zhǔn)進(jìn)行了行數(shù)據(jù)的排序。
# 2.按 DD 列進(jìn)行 行數(shù)據(jù)的 降序 排序
data_res=data.sort_values(by=["DD"],ascending=False,axis=0)
print(data_res)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
5 33 33 NaN 75.0 67.0
4 10 45 326.0 69.9 55.0
2 7 23 345.0 33.9 23.0
0 11 3 3230.0 45.6 20.0
3 5 11 2361.0 59.5 4.0
1 4 2 2124.0 67.0 NaN
# 結(jié)果解析:我們這里以 EE 列為標(biāo)準(zhǔn),進(jìn)行行數(shù)據(jù)的降序排序,可以看到數(shù)據(jù)的排序結(jié)果,這里要注意一點(diǎn)就是 DD 列數(shù)據(jù)存在缺失值 NaN ,默認(rèn)的參數(shù) na_position='last' 表示將缺失值放在最后。
# 3.na_position='first' 參數(shù) ,按 DD 列進(jìn)行 行數(shù)據(jù)的 降序 排序
data_res=data.sort_values(by=["DD"],ascending=False,axis=0,na_position='first')
print(data_res)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
1 4 2 2124.0 67.0 NaN
5 33 33 NaN 75.0 67.0
4 10 45 326.0 69.9 55.0
2 7 23 345.0 33.9 23.0
0 11 3 3230.0 45.6 20.0
3 5 11 2361.0 59.5 4.0
# 結(jié)果解析:這里依然是按 DD 列進(jìn)行行排序,通過(guò)設(shè)置 na_position='first' 缺失值放在了開(kāi)始位置。
# 4.設(shè)置axis=1,以行為判斷標(biāo)準(zhǔn)進(jìn)行列排序
data_res=data.sort_values(by=[3],ascending=False,axis=1)
print(data_res)
# --- 輸出結(jié)果 ---
CC EE AA BB DD
0 3230.0 45.6 3 11 20.0
1 2124.0 67.0 2 4 NaN
2 345.0 33.9 23 7 23.0
3 2361.0 59.5 11 5 4.0
4 326.0 69.9 45 10 55.0
5 NaN 75.0 33 33 67.0
# 結(jié)果解析:這里我們?cè)O(shè)置 axis=1 表示對(duì)列進(jìn)行排序,ascending=False 進(jìn)行降序排序,通過(guò)設(shè)置 by=[3],這里表明以第四行為排序依據(jù)對(duì)列進(jìn)行降序排序。
3. Pandas 排名操作
排名操作是根據(jù)數(shù)據(jù)的大小,判斷出該數(shù)據(jù)在數(shù)據(jù)集中的名次,默認(rèn)是從 1 開(kāi)始一直到數(shù)據(jù)中有效數(shù)據(jù)的長(zhǎng)度,如果存在重復(fù)數(shù)據(jù),則會(huì)求出這幾個(gè)數(shù)據(jù)的平均排名。Pandas 庫(kù)中針對(duì)排名操作提供了方便的操作函數(shù) rank () .
df.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
接下來(lái)我們列舉該函數(shù)常用的一些參數(shù):
參數(shù)名 | 說(shuō)明 |
---|---|
axis | 指定是在行上,還是列上進(jìn)行排名。默認(rèn)是 axis=0 從列上進(jìn)行排名 |
method | 平級(jí)排名的取值方法,有四種方式。 |
method 用于平級(jí)數(shù)據(jù),也就是要排名的數(shù)據(jù)中,他們的大小是一樣的,這種平級(jí)的數(shù)據(jù)有四種排名的方式:
- average:在一組相等的排名數(shù)據(jù)中,為每個(gè)數(shù)據(jù)取他們的平均排名;
- min:在一組相等的排名數(shù)據(jù)中,使用最小的排名給每個(gè)數(shù)據(jù);
- max:在一組相等的排名數(shù)據(jù)中,使用最大的排名給每個(gè)數(shù)據(jù);
- first:在一組相等的排名數(shù)據(jù)中,按各個(gè)值在原始數(shù)據(jù)中的出現(xiàn)順序進(jìn)行排名。
下面我們通過(guò)程序代碼詳細(xì)講解排名函數(shù)的用法:
# 導(dǎo)入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第15小節(jié)/execl數(shù)據(jù)demo.xlsx"
# 解析數(shù)據(jù)
data = pd.read_excel(data_path)
print(data)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
0 11 3 3230.0 45.6 20.0
1 4 2 2124.0 67.0 NaN
2 7 23 345.0 33.9 23.0
3 5 11 2361.0 59.5 4.0
4 10 45 326.0 69.9 55.0
5 33 33 NaN 75.0 67.0
# rank() 函數(shù)
# 1. 默認(rèn)的 axis=0,在列上進(jìn)行排序
data_res=data.rank()
print(data_res)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
0 5.0 2.0 5.0 2.0 2.0
1 1.0 1.0 3.0 4.0 NaN
2 3.0 4.0 2.0 1.0 3.0
3 2.0 3.0 4.0 3.0 1.0
4 4.0 6.0 1.0 5.0 4.0
5 6.0 5.0 NaN 6.0 5.0
# 結(jié)果解析: 通過(guò) rank() 函數(shù)默認(rèn)的在列方向進(jìn)行排名的操作,比如"BB"列中,每一個(gè)數(shù)據(jù)在該列中的名次都得到了體現(xiàn),但對(duì)于出現(xiàn)的缺失值 NaN 數(shù)據(jù),是不進(jìn)行排名計(jì)算的。
# 2. 設(shè)置的 axis=1,在行放方向上進(jìn)行排序
data_res=data.rank(axis=1)
print(data_res)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
0 2.0 1.0 5.0 4.0 3.0
1 2.0 1.0 4.0 3.0 NaN
2 1.0 2.5 5.0 4.0 2.5
3 2.0 3.0 5.0 4.0 1.0
4 1.0 2.0 5.0 4.0 3.0
5 1.5 1.5 NaN 4.0 3.0
# 結(jié)果解析:這里我們?cè)O(shè)置了在行上進(jìn)行排名的計(jì)算,這里看到最后一行,因?yàn)槲覀冊(cè)瓟?shù)據(jù)該行的前兩列數(shù)據(jù)時(shí)候相同的,都是 33,這里因?yàn)槟J(rèn)的 method=average,所有33取了他們平均排名 1+2 的平均值 1.5。 接下來(lái)我們?cè)O(shè)置 method=first ,看一下處理效果:
# 3. 設(shè)置 method=‘first’,修改默認(rèn)的相同排名的處理方式
data_res=data.rank(axis=1,method='first')
print(data_res)
# --- 輸出結(jié)果 ---
BB AA CC EE DD
0 2.0 1.0 5.0 4.0 3.0
1 2.0 1.0 4.0 3.0 NaN
2 1.0 2.0 5.0 4.0 3.0
3 2.0 3.0 5.0 4.0 1.0
4 1.0 2.0 5.0 4.0 3.0
5 1.0 2.0 NaN 4.0 3.0
# 結(jié)果解析:同樣的我們還是看最后一行,因?yàn)槲覀冊(cè)O(shè)置了 method='first' ,所以對(duì)于相同排名的數(shù)據(jù),會(huì)使用該數(shù)據(jù)在原數(shù)據(jù)中的出現(xiàn)順序進(jìn)行處理,所以第五行的前兩列的數(shù)據(jù)排名分別為 1,2。
4. 小結(jié)
本節(jié)課程我們主要學(xué)習(xí)了 Pandas 對(duì)于數(shù)據(jù)的排序和排名操作,針對(duì)排序還具體分為了按索引進(jìn)行排序和按數(shù)據(jù)值進(jìn)行排序,主要涉及了 sort_index () 函數(shù),sort_values () 函數(shù)和 rank () 函數(shù)的操作。本節(jié)課程的重點(diǎn)如下:
- 排序函數(shù) sort_index () 和 sort_values () 的區(qū)別和使用;
- rank () 函數(shù)用于數(shù)據(jù)排名的具體操作方法。