zoukankan      html  css  js  c++  java
  • 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()函数的一点认识

  • 相关阅读:
    剑指Offer--反转链表
    剑指Offer--链表中倒数第k个结点
    面向对象的六原则一法则
    常见错误汇总
    记人生第一次CF体验
    Game of Credit Cards
    Shell Game (模拟)
    数列分块入门 1 LibreOJ
    范德蒙恒等式
    C. Vasya and String (尺取法)
  • 原文地址:https://www.cnblogs.com/hider/p/15559230.html
Copyright © 2011-2022 走看看