Python學習筆記:pd.rank排序


一、介紹

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.DataFrame.rank

參考鏈接:圖解Pandas的排名rank機制

參考鏈接:關於pandas的rank()函數的一點認識


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM