楼主: zwy_0309
1016 1

按每科成绩分别排名 [推广有奖]

  • 1关注
  • 3粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
342 个
通用积分
128.8010
学术水平
11 点
热心指数
9 点
信用等级
7 点
经验
4173 点
帖子
69
精华
0
在线时间
150 小时
注册时间
2019-6-4
最后登录
2025-8-19

楼主
zwy_0309 在职认证  发表于 2020-12-18 16:24:03 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
      今天遇到一个问题:厂家有N个产品,每个产品有M家门店销售,厂家需要快速找出每个产品销售最好的前5名门店。      这个需求类似找出“各科成绩前5名的学生”。简单试了一下,可以使用groupby+rank解决,详细如下:

      一、rank()函数简介
   def rank(self: FrameOrSeries,
         axis: Any = 0,
         method: str = "average",
         numeric_only: Optional[bool] = None,
         na_option: str = "keep",
         ascending: bool = True,
         pct: bool = False) -> FrameOrSeries

       说明:
        1、self: FrameOrSeries。说明该函数可以处理frame或Series类型数据的排名。
        2、axis: Any = 0。默认是0,按行排名。窃个图说明一下吧
         axis.png
      3、 method : {‘average’, ‘min’, ‘max’, ‘first’}   默认值 average。

            如果分数为98,97,97,96,95,94,则各个方式排名的说明和结果如下:

        first : 按值在原始数据中的出现顺序分配排名。   排序结果:1,2,3,4,5,6

        average :在相等分组中,为各个值分配平均排名。 排序结果:1,2.5, 2.5, 4, 5 ,6

      min :使用整个分组的最小排名    排序结果:1,2,2,4,5,6

      max :使用整个分组的最大排名   排序结果:1,3,3,4,5,6


       4、numeric_only: Optional[bool] = None 。 如果设置为True,则只对数字有效
       5、na_option: str = "keep" 。默认针对空值的处理,不排名;如果设置na_option='bottom',则空值为最后一名。
       6、ascending: bool = True。 默认数值最小的为第一名,如果需要数值最大的为第一名,则设置:ascending=False.
       7、 pct: bool = False。 排名按百分比进行,名次最高者为1,其他为名次占最高名次的百分比,如例第6名为显示为1,第1名显示为1/6,即0.16666……

      二、需要处理的数据
       学生各科成绩.png
      三、使用的脚本
             Step1: 增加排名列,对所有学生进行排名
          book = pd.read_excel('e:/dan/2.xlsx')
          grade = pd.DataFrame(book)
          grade = grade.sort_values(by=['kemu', 'fenshu'], ascending=False)
          grade['paiming'] = grade.groupby('kemu')['fenshu'].rank(method='first', ascending=False)
          print(grade)              结果:     
       kemu  stu  fenshu  paiming
30     math   z4      98      1.0
21     math   z1      85      2.0
22     math   z7      85      3.0
17     math   z8      74      4.0
      【注意】
      对原数据先进行排序是必要的,否则显示出的结果不会按科目和分数排序。

       Step2: 再筛选Topn,这里以Top2为例。
     Top2 = grade[grade['paiming'] <= 2]
     print(Top2)     
      结果:
       kemu stu  fenshu  paiming
30     math  z4      98      1.0
21     math  z1      85      2.0
22     math  z7      85      3.0
17     math  z8      74      4.0
10     math  z2      65      5.0
27  english  z3      95      1.0
28  english  z7      95      2.0
25  english  z6      88      3.0
23  english  z2      85      4.0
18  english  z5      77      5.0

       OK,仅此,The End!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Dataframe Optional average numeric Option

已有 2 人评分经验 收起 理由
cheetahfly + 100 热心帮助其他会员
yunnandlg + 100 精彩帖子

总评分: 经验 + 200   查看全部评分

沙发
zwy_0309 在职认证  发表于 2020-12-18 16:48:29
如果以科目为第一列,第二列显示该科第1名,第三列显示该科第2名,则可以使用脚本:
pivot2 = Top2.pivot('kemu', 'paiming', 'stu')
print(pivot2)
结果:
           paiming 1.0 2.0
kemu           
chinese             z5  z2
english              z3  z7
math                 z4  z1

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-29 03:41