这是我参与更文挑战的第4天,活动详情查看:更文挑战
前情回顾
- 找到小明和李晓华计分不同的学号(已完成一半)
- 找到计分不同的列(已完成)
- 找到该列的学号
- 对计分错误的学生的各科成绩进行分组求和(未完成)。
找到该列的学号
我们回忆以下之前简单介绍过的数据结构 ,数据结构的data对于series来说,是一个一维array数据,对于dataframe来说,是二维array数据。因此我们可以直接使用如下操作
data_clean.values[:,0]
//data_clean.values[:3,0]
//这里我只取前三行,因为单科数据也是我编的。
对计分错误的学生的各科成绩进行分组求和
单科数据如下
filepath_danke = "单科数据.csv"
data_table_danke = pd.read_csv(filepath_danke, encoding='utf-8')
data_table_danke
输出如下:
那么如何实现分组求和呢?
首先思考下分组求和的场景:
依据 [性别分组],统计全国人口 [寿命]的 [平均值] 依据 [班级分组],筛选出组内 [数学分数]的 [平均值]超过 80 分的班级
很明显,分组需要三种概念:
- 依据什么分组
- 获取什么数据
- 对数据进行什么操作
这里我们需要依据[学号分组],统计出学生[成绩]的[总成绩和]。
那么pd为我们提供了group by的函数(这里就可以看出在命名上跟sql很像了)
df.groupby(依据什么分组)[获取什么数据].对数据进行什么操作
举个例子
student_sum = data_table_danke.groupby('学号')['成绩'].sum()
学号
20160003 548
20160006 489
20160010 221
Name: 成绩, dtype: int64
目前我们通过了一个简单的案例学到了筛选和分组求和,对于一些常用的数据分析操作来说,还差一个排序。那么我们就添加一个需求。
新增需求:每人科目最高分和次高分之和
从正常的逻辑上来说,应该先分组再排序再求和.
但我们很难对分组后的数据进行排序以后取前两位(至少我目前不会)
那么我们可以利用分组的一个特性
分组不会影响组内的排序
因此可以先排序后分组再求和
即
filepath_danke = "单科数据.csv"
data_table_danke = pd.read_csv(filepath_danke, encoding='utf-8')
data_table_danke.sort_values('成绩', ascending = False, inplace=True)
res = data_table_danke.groupby('学号').head(2).groupby('学号')['成绩'].sum()
res