一、介绍

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()函数的一点认识