一、介绍
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机制