Pandas 排序和排名操作
1. 前言
上一小節,我們學習了 Pandas 庫對于多個數據集的連接和合并操作,滿足了我們在數據行和列上的內容擴展需要,除了這點,我們很多時候也需要對某個數據集中的數據進行排序操作,按照遞增或者遞減的方式將數據依據某個條件進行排序,Pandas 庫針對這樣一個較為常見的數據處理需求,又提供了怎樣的操作方式呢?
本節我們將一起學習 Pandas 庫中對于數據的排序操作,分為按索引排序和按數據值進行排序,除了排序功能,Pandas 還提供了排名的操作,接下來我們一起學習 Pandas 庫的排序和排名操作吧。
2. Pandas 排序操作
Pandas 對于排序的操作分為按索引排序和按數據值排序,分別通過函數 sort_index () 和 sort_values () 進行實現,接下來我們詳細學習每個函數的使用方式。首先我們通過 Excel 進行數據的解析。
Pandas 解析的數據對象 data 具體內容如下:
# 導入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第15小節/execl數據demo.xlsx"
# 解析數據
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 data 數據對象 ---
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 () 函數
該函數是對數據集進行按索引進行排序時使用的,里面提供了豐富的函數,下面我將列舉幾個常用的參數。
df.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
參數名 | 說明 |
---|---|
axis | 排序的索引軸,axis=0 行索引(默認),axis=1 列索引 |
ascending | ascending=True 升序或是 ascending=False 降序排序 |
下面我們將通過上面從 Excel 解析的數據集 data 進行該函數這個參數的代碼演示:
# data 為上面從 Excel 中解析出來的數據
# 1.按行索引進行降序排列 axis=0,ascending=False
data_res=data.sort_index(axis=0,ascending=False)
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:通過對這兩個參數的設置,我們按照行索引進行了降序排列。
# 2.按列索引進行降序排列 axis=1,ascending=False
data_res=data.sort_index(axis=1,ascending=False)
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:通過設置按照列索引,進行降序排列數據,可以看到輸出結果。
# 3.按列索引進行降序排列 axis=1,ascending=True
data_res=data.sort_index(axis=1,ascending=True)
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:通過設置按照列索引進行升序排列數據,可以看到列數據的索引順序變為了從 AA 到 EE 。
2.2 sort_values () 函數
該函數是專門用于數據集進行數據值的排序使用,下面同樣我列舉了他常用的一些參數設置。
pd.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
參數名 | 說明 |
---|---|
by | 指定需要排序的列或者行 |
axis | 指定需要排序的是列還是行,默認 axis=0 表示行 |
ascending | 設置升序還是降序,默認是 ascending=True 為升序 |
na_position | 設置缺失值顯示的位置,有 first 和 last 兩個值,默認是 last |
下面我們利用前面解析出來 data 數據集,進行各參數詳細的設置使用。
# data 為上面從 Excel 中解析出來的數據
# 1.按 AA 列進行 行數據的 升序 排序
data_res=data.sort_values(by=["AA"],ascending=True,axis=0)
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:我們這里通過 by 參數設置了是以 AA 列為標準,進行 axis=0 行數據的 ascending=True 升序排序,可以看到 AA 列數據分別為 2,3,11,23,33,45,以此為標準進行了行數據的排序。
# 2.按 DD 列進行 行數據的 降序 排序
data_res=data.sort_values(by=["DD"],ascending=False,axis=0)
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:我們這里以 EE 列為標準,進行行數據的降序排序,可以看到數據的排序結果,這里要注意一點就是 DD 列數據存在缺失值 NaN ,默認的參數 na_position='last' 表示將缺失值放在最后。
# 3.na_position='first' 參數 ,按 DD 列進行 行數據的 降序 排序
data_res=data.sort_values(by=["DD"],ascending=False,axis=0,na_position='first')
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:這里依然是按 DD 列進行行排序,通過設置 na_position='first' 缺失值放在了開始位置。
# 4.設置axis=1,以行為判斷標準進行列排序
data_res=data.sort_values(by=[3],ascending=False,axis=1)
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:這里我們設置 axis=1 表示對列進行排序,ascending=False 進行降序排序,通過設置 by=[3],這里表明以第四行為排序依據對列進行降序排序。
3. Pandas 排名操作
排名操作是根據數據的大小,判斷出該數據在數據集中的名次,默認是從 1 開始一直到數據中有效數據的長度,如果存在重復數據,則會求出這幾個數據的平均排名。Pandas 庫中針對排名操作提供了方便的操作函數 rank () .
df.rank(axis=0, method='average', numeric_only=None, na_option='keep', ascending=True, pct=False)
接下來我們列舉該函數常用的一些參數:
參數名 | 說明 |
---|---|
axis | 指定是在行上,還是列上進行排名。默認是 axis=0 從列上進行排名 |
method | 平級排名的取值方法,有四種方式。 |
method 用于平級數據,也就是要排名的數據中,他們的大小是一樣的,這種平級的數據有四種排名的方式:
- average:在一組相等的排名數據中,為每個數據取他們的平均排名;
- min:在一組相等的排名數據中,使用最小的排名給每個數據;
- max:在一組相等的排名數據中,使用最大的排名給每個數據;
- first:在一組相等的排名數據中,按各個值在原始數據中的出現順序進行排名。
下面我們通過程序代碼詳細講解排名函數的用法:
# 導入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第15小節/execl數據demo.xlsx"
# 解析數據
data = pd.read_excel(data_path)
print(data)
# --- 輸出結果 ---
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() 函數
# 1. 默認的 axis=0,在列上進行排序
data_res=data.rank()
print(data_res)
# --- 輸出結果 ---
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
# 結果解析: 通過 rank() 函數默認的在列方向進行排名的操作,比如"BB"列中,每一個數據在該列中的名次都得到了體現,但對于出現的缺失值 NaN 數據,是不進行排名計算的。
# 2. 設置的 axis=1,在行放方向上進行排序
data_res=data.rank(axis=1)
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:這里我們設置了在行上進行排名的計算,這里看到最后一行,因為我們原數據該行的前兩列數據時候相同的,都是 33,這里因為默認的 method=average,所有33取了他們平均排名 1+2 的平均值 1.5。 接下來我們設置 method=first ,看一下處理效果:
# 3. 設置 method=‘first’,修改默認的相同排名的處理方式
data_res=data.rank(axis=1,method='first')
print(data_res)
# --- 輸出結果 ---
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
# 結果解析:同樣的我們還是看最后一行,因為我們設置了 method='first' ,所以對于相同排名的數據,會使用該數據在原數據中的出現順序進行處理,所以第五行的前兩列的數據排名分別為 1,2。
4. 小結
本節課程我們主要學習了 Pandas 對于數據的排序和排名操作,針對排序還具體分為了按索引進行排序和按數據值進行排序,主要涉及了 sort_index () 函數,sort_values () 函數和 rank () 函數的操作。本節課程的重點如下:
- 排序函數 sort_index () 和 sort_values () 的區別和使用;
- rank () 函數用于數據排名的具體操作方法。