一、介紹
Pandas.rank()
函數用於實現對數據的排序,包括順序排序、跳躍排序和密集排序等。
使用方法:
DataFrame.rank(axis=0,
method='average',
numeric_only=None,
na_option='keep',
ascending=True,
pct=False)
參數說明:
axis -- 0表示按橫軸,1表示按縱軸
method -- 排序方式:average、first、min、max、dense
numeric_only -- 是否僅計算數值列
na_option -- 空值處理方式:keep、top、bottom
ascending -- 升序、降序
pct -- 排名百分比
二、實操
1.Series排名
- method參數:控制排序的模式
import pandas as pd
import numpy as np
data = pd.Series([8,-5,8,5,3,0,5])
# 1.默認按平均值排序 如果兩個數值相同 排名為均值
data.rank()
# 2.根據值在原始數據中出現的順序進行排名
data.rank(method='first')
# 3.相同數值的排名取最小值
data.rank(method='min')
# 4.相同數值的排名取最大值
data.rank(method='max')
# 5.相同數值排名不出現跳躍 連續排序
data.rank(method='dense')
- ascending參數:默認升序
data.rank(ascending=False)
data.rank(method='max', ascending=False)
- pct參數:顯示百分比
data.rank(pct=True)
'''
0 0.928571 # 6/7
1 0.142857
2 0.928571
3 0.642857
4 0.428571
5 0.285714
6 0.642857
dtype: float64
'''
data.rank(method='dense',
ascending=False,
pct=True)
- na_option參數:keep、top、bottom
data2 = pd.Series([8,-5,8,5,3,np.nan,5])
# 保留空值
data2.rank(method='dense', na_option='keep')
# 空值排名第一
data2.rank(method='dense', na_option='top')
# 空值墊底
data2.rank(method='dense', na_option='bottom')
2.DataFrame排名
- 構建測試數據框
df = pd.DataFrame({"class":["語文","語文","語文","語文","語文","數學","數學","數學","數學","數學"],
"name":["小明","小蘇","小周","小孫","小王","小明","小蘇","小周","小孫","小王"],
"score":[137,125,125,115,115,80,111,130,130,140]})
df
- 排序
df1 = df[df['classes'] == '語文']
df2 = df.query("classes == '語文'")
df1.loc[:,'rank_average'] = df1['score'].rank(ascending=False)
df1['jump_min'] = df1['score'].rank(method='min', ascending=False)
df1['jump_max'] = df1['score'].rank(method='max', ascending=False)
df1['rank_dense'] = df1['score'].rank(method='dense', ascending=False)
df1['rank_first'] = df1['score'].rank(method='first', ascending=False)
df1
'''
classes name score rank_average jump_min jump_max rank_dense \
0 語文 小明 137 1.0 1.0 1.0 1.0
1 語文 小蘇 125 2.5 2.0 3.0 2.0
2 語文 小周 125 2.5 2.0 3.0 2.0
3 語文 小孫 115 4.5 4.0 5.0 3.0
4 語文 小王 115 4.5 4.0 5.0 3.0
rank_first
0 1.0
1 2.0
2 3.0
3 4.0
4 5.0
'''
- 總分排名
# 添加總分列
df['total_score'] = df.groupby('name')['score'].transform('sum')
df['total_dense'] = df['total_score'].rank(method='dense', ascending=False)
3.groupby排名
# 定義一個:提取排名第2的函數
def rank_second(x):
return x[x['score'].rank(method='dense', ascending=False) == 2]
# 分組之后求排名
df.groupby('classes').apply(rank_second)
三、總結
同 SQL
中的窗口函數(OLAP
函數:Online Anallytical Processing
)對比:
- row_number 順序排名 -- method='first'
- rank 跳躍排名 -- method='min'
- dense_rank 密集排名 -- method='dense'
<窗口函數> over (partition by col order by col2)
-- rank
-- dense_rank
-- row_number
-- sum/avg/count/max/min
參考鏈接:圖解Pandas的排名rank機制