此前,我们已经分别介绍了使用VBA、JSA 实现多条件排序的实操方法。而在数据处理中,Python同样是实现多条件排序的常用工具,因此接下来我们介绍对应的 Python 处理方式。
为了能够直观、清晰地查看多条件排序的最终执行效果,本次我们将借助 Jupyter Notebook 工具来完成结果可视化展示。下面我们直接来看完整的实操代码。
import pandas as pdimport os os.chdir(r'E:\TestData')df = pd.read_excel('sort.xlsx', header=1, usecols='b,f,g,h')df = df.sort_values(by = ['总分','等级值1','等级值2'], ascending = [0,0,0]).reset_index(drop = True)df['名次'] = df.groupby(['总分','等级值1','等级值2']).ngroup(ascending = False).rank(method = 'min').astype(int)df
相较于前面介绍的 VBA 代码和 JSA 代码,利用 Python 编写的代码在写法上更加精简清爽。接下来,我们就一起查看对应的程序运行结果。
最终得到的处理结果和前面两种方法的输出结果完全一致,唯一区别就是 Jupyter Notebook 会自动对名次完成排序展示。
最后我们对核心代码做个解释:
第 5 行代码:
读取名为 sort.xlsx的 Excel 文件,把表格的第 2 行设为表头,只提取 B、F、G、H 这四列的数据,读取完成后存入变量 df。
这里我们需要留意:表格第一行是合并单元格,内容是 “成绩表”,属于表格标题,并不是正式的字段表头,因此我们选用第 2 行作为表头。
另外要记住,Pandas 内部的行索引是从 0 开始计算的,所以设置 header=1,对应的就是 Excel 里的第 2 行。
第 6 行代码:
sort_values ()
Pandas 专门用来排序的函数,能够依据指定列的数据,调整表格内各行的先后顺序。
by = [' 总分 ',' 等级值 1','等级值 2']
用于设置多条件排序依据。排序时会优先依据【总分】进行排序;若多条数据的总分一致,就接着依据【等级值 1】排序;倘若总分、等级值 1 两项数值都相同,则最后依据【等级值 2】排序。
ascending = [0,0,0]
用来分别设置每一项排序条件是升序还是降序。其中 1 代表升序,也就是数值从小到大排列;0 代表降序,也就是数值从大到小排列。[0,0,0] 意味着三项排序条件全部使用降序,总分由高到低排列,等级值 1 由高到低排列,等级值 2 同样由高到低排列。
.reset_index (drop = True)
数据完成排序后,原本的行索引顺序会变得杂乱。reset_index () 的作用是重新生成一组连续有序的行编号;drop=True 代表直接舍弃原先混乱的旧索引,不会把旧索引单独新增成一列保存下来。
第 7 行代码:
df [' 名次 '] =
在数据表 df 中新建一列,列名设置为 “名次”,等号右侧代码运算得出的结果,将会赋值给这一新列。
df.groupby ([' 总分 ',' 等级值 1','等级值 2'])
依据总分、等级值 1、等级值 2 三个字段组合进行分组。只要某几条数据这三个字段的数值完全一致,对应的行就会被归到同一个分组内。
.ngroup (ascending = False)
.ngroup () 的作用是为每一个分组分配专属的数字编号。默认状态下分组编号从小到大依次分配;设置 ascending=False 之后,分组编号将改为倒序分配。简单来说,综合得分越高的分组,得到的编号数值越小。
.rank (method = 'min')
针对前面生成的分组编号开展排名计算。method='min' 代表采用最小排名法处理并列情况,这也是竞赛里经常使用的排名规则。举个例子:两人并列第 1 名,紧随其后的人员名次直接为第 3 名。
.astype (int)
排名运算完成后得到的数据默认是小数形式,这段代码会把排名结果转换为整数,保证名次不会出现小数。
今天的分享就到这儿啦,非常感谢您对“Python SQL审天下”公众号的关注和点赞。如果您觉得我的公众号能给您带来一丝丝的收获,请多多转发给您的朋友圈,让更多的人看到并了解。也许您不经意间的点赞和转发,会给他人带来独特的体验和感受。