DataFrame的分组排序(笔试常用)

DataFrame的分组排序(笔试常用)

零基础学Python数据分析 >> Pandas >> DataFrame的分组排序(笔试常用)

前言

大家好,这里是零基础学Python数据分析系列。

这个系列所有的代码编写均是Python3版本。



之前我们介绍了DataFrame的排序函数和分组函数,那么如何实现DataFrame的分组排序呢?这也是Pandas笔试题常考的内容。

本章让我们来解决两个问题:

问题1:如何取出每个班级Python成绩的第一名?(分组排序,取每组的前几条数据)

问题2:给每个学生按班级进行Python成绩排名,新增一个排名的序号。(分组排序,给每个样本按类型加个序号)

先创建一个DataFrame

先创建一个学生姓名、班级、Python成绩的DataFrame。

输入:

import pandas as pd
import numpy as np
Student_dict = {'姓名':['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九', '郑十'],
                '班级':['A班', 'A班', 'A班', 'A班','B班', 'B班','B班', 'B班'],
                'Python成绩':[100, 90, 90, 80, 90, 80, 70, 60]}
# 字典创建DataFrame,字典键变DataFrame的列名
df = pd.DataFrame(data=Student_dict)
df

输出:

这两个问题应该如何实现?

问题1:如何取出每个班级Python成绩的第一名?(分组排序,取每组的前几条数据)

问题2:给每个学生按班级进行Python成绩排名,新增一个排名的序号。(分组排序,给每个样本按类型加个序号)

问题1:分组排序,取每组的前几条数据

取每个班级Python成绩的第一名,我们可以先用sort_values函数按Python成绩逆序排序,再分组取每组的第一条数据。

实现方式如下:

# 取出每个班级,Python成绩第一名的学生。
# 先排序
df = df.sort_values('Python成绩', ascending=False)
# 再分组取每组的第一条数据
df.groupby('班级').head(1)

输出:

说明:

groupby函数有一个特性,分组后,每组的数据排序和原来的数据排序是一样的。

比如原数据,按Python成绩倒序排序后,分组后,每组的样本还是按Python成绩倒序排序。

所以可以先用sort_values函数按Python成绩逆序排序,再分组取每组的第一条数据,以此来得到每个班级Python成绩的第一名。

问题2: 分组排序,给每个样本按类型加个序号

DataFrame的排名函数rank()

首先我们来介绍一下DataFrame的的排名函数rank()。



用rank函数,给每个学生进行Python成绩排名,新增一个排名的序号。(此处不分班级,介绍一下rank函数的用法)

输入:

# rank函数
df['Python成绩排名'] = df['Python成绩'].rank(method='min', ascending=False)
df

输出:

rank函数参数介绍:

ascending:排序方式,True正序,False逆序。
method:如何对具有相同值的记录进行排名。取值可以为:average、min、max、first、dense。
average:相同排名下,取平均值进行排名。比如李四、王五为第二、第三名,孙7为第四名,那么李四、王五取值为2.5,孙7取值为4。