以实战学习pandas使用方式:统计考生成绩统计及分布

news2024/9/21 11:01:12

以实战学习pandas使用方式:统计考生成绩统计及分布

  • 引子
  • 需求
  • 逐步实现
    • 使用 pandas 读 excel
    • 初始化一些数据
    • 获取 excel 列名
    • 获取总表的统计数据
    • 分班级数据
    • 各科目比率统计
    • 统计名次分布
  • 写入文件
  • 小结

引子

老顾日常工作,是用不到 python 的,所以,老顾的 python 学习进度推进的非常缓慢,至今没用上 pandas 和 numpy,即便参加了新星计划艾派森的学习小组,也没什么动力去看这方面的内容。

结果,昨天在群里,有个小伙伴问老顾能不能帮忙做个数据统计。由于老顾最近准备开营做一期数据库进阶查询的内容,所以这个小伙伴就问怎么用数据库做。

然后的然后,发现这个小伙伴是学了一些 python 基础的。。。。。好么,放着 pandas 不用,想要装个 sqlserver 。。。。也是够可以的。

于是,老顾就用这个小伙伴的内容,做了一次学习,熟悉一下 pandas。

CSDN 文盲老顾的博客,https://blog.csdn.net/superwfei

需求

在这里插入图片描述
首先,是有这么一个 excel 表,记录了某年级全部学生的考试成绩。

然后,需要得到全部学生各科的平均分,及格率以及优秀率。

其次,将总表按班级分成多个子表,并对每个班级统计各科的平均分,及格率及优秀率。

再然后,出一个统计表,统计各科目中,各班的平均分,合格率,优秀率,并按照一定权重,计算出最后的合计分,并对合计分进行排名。

最后,出一个简单的统计,统计每个班,前n名各有多少人。

嗯。。。。。好么,一看这需求,那 pandas 必须上啊,一个学习 pandas 的好机会。

逐步实现

使用 pandas 读 excel

import pandas as pd
source = r'期中测试成绩汇总.xls'
df = pd.read_excel(source,sheet_name='学生总成绩')

为了以后使用方便,把文件名单独放到变量中,后续使用就方便一点。

然后,pandas 自带读 excel 文件的方法,并且可以指定 sheet。很方便哦。

初始化一些数据

对于平均分,我们好弄,但是及格率和优秀率,却需要一些数据支持了。经过与小伙伴的沟通,初始了两个字典。

# 初始化常数,满分和统计比率
full = {'语文':120,'数学':120,'英语':120,'物理':70,'政治':70,'化学':50,'历史':50,'总分':600}
grade = {'及格':60,'优秀':80}

用full来记录各科目的满分成绩,用 grade 来记录各档次为满分的百分之多少。

获取 excel 列名

为了保证数据的一致性,我们要读一次 excel 列名,在之后附加数据的时候,保证各列的顺序不会发生紊乱。

# 获取列名
columns = [k for k,d in df.iteritems()]

pandas 自己提供了 iteritems 方法,这就是一个迭代推导式,直接遍历即可。

获取总表的统计数据

# 平均分
print(['','平均分'] + [round(v,2) for v in df.mean()])
# 各种率
print([['',g + '率'] + [round(len(df[df[k] >= full[k] * grade[g] / 100]) / len(df) * 100,2) for k,d in df.iteritems() if k in full] for g in grade])

在这里插入图片描述
可以看到平均分很方便,直接 mean 即可。。。。。

而各种率,老顾就用推导式直接弄了,推导式的学习,可以参考老顾的文章《python 基础系列篇:八、熟练掌握推导式》。

计算方式也很简单,使用 pandas 自带的筛选功能 pd[pd[列] 条件] 可以得到符合条件的结果集,用 len 测下长度,比上总数,就是各种率了。

这里的条件,就是用各科满分成上各种率的比例,为了避免出错,还要限定列是出现在各科目字典中的。

总之,用推导式就完事。

最后把这几个数据,也转成 DataFrame。

# 获取总平均分,总及格率,总优秀率
app = pd.DataFrame([[],[]] + [['','平均分'] + [round(v,2) for v in df.mean()]] + [['',g + '率'] + [round(len(df[df[k] >= full[k] * grade[g] / 100]) / len(df) * 100,2) for k,d in df.iteritems() if k in full] for g in grade],columns=columns)

分班级数据

后边的数据,要分成各个班级,做成子表,所以,先获取下班级信息。集合加排序,很方便。

# 获取班级号
clss = sorted(set(df['班级']))

需要注意变量名不要使用关键字,比如 class 或者 cls 之类的,会报语法错误哦。

得到班级号之后,直接用列表推导式,得到各班级各自的成绩即可。还是用 DataFrame 的筛选功能。

# 获得各班成绩
班级成绩 = [df.loc[df['班级'] == k] for k in clss]

变量名可以用中文哦,实在不知道怎么给变量起名,作为起名废,那就直接上中文。

然后按照总表得到的统计方式,统计各班的统计信息。

# 获得各班统计
班级统计 = [pd.DataFrame([[],[]] + [['','平均分'] + [round(v,2) for v in 班级成绩[i].mean()]] + [['',g + '率'] + [round(len(班级成绩[i][班级成绩[i][k] >= full[k] * grade[g] / 100]) / len(班级成绩[i]) * 100,2) for k,d in 班级成绩[i].iteritems() if k in full] for g in grade],columns=columns) for i,k in enumerate(clss)]

推导式玩得转,代码就看着很简略。

各科目比率统计

再次沟通后得到各比率的权重和列名集合,继续用推导式得到结果。

# 四率计算
四率列名 = ['班级','平均分','折合','及格率','折合','优秀率','折合','巩固率','折合','合计分','名次']

四率 = [[[k,班级统计[i].loc[2][科目],round(班级统计[i].loc[2][科目] * .2,2),班级统计[i].loc[3][科目],round(班级统计[i].loc[3][科目] * .5,2),班级统计[i].loc[4][科目],round(班级统计[i].loc[4][科目] * .1,2),100,10,round(班级统计[i].loc[2][科目] * .2 + 班级统计[i].loc[3][科目] * .5 + 班级统计[i].loc[4][科目] * .1 + 10,2),0] for i,k in enumerate(clss)] for 科目 in full]

名次项,小伙伴有特殊需求,需要1班和2班比较,3,4,5,6,7班进行比较,得出各自的排名。所以,这个只能用循环做了。

final = []
for i,k in enumerate(full):
    arr = 四率[i]
    rank1 = sorted(set([v[9] for u,v in enumerate(arr) if u < 2]),reverse=True)
    rank2 = sorted(set([v[9] for u,v in enumerate(arr) if u > 1]),reverse=True)
    for u,j in enumerate(arr):
        j[10] = (rank1 if u < 2 else rank2).index(j[9]) + 1
    final += [[k,*['' for _ in range(10)]],四率列名] + arr + [[''] * 11]
四率表 = pd.DataFrame(final,columns = 四率列名)      

得出两个排名,然后根据班级序号,更新到四率信息中。最后也转成 DataFrame。

在这里插入图片描述

统计名次分布

这次,是先建立一个 DataFrame,然后,再对各单元格数据进行更新

# 名次分布
分布 = pd.DataFrame([[c,*[0 for _ in range(10)]] for c in clss],columns=['班级',*['前{}名'.format(i * 10) for i in range(1,11)]])
for i in range(1,11):
    tmp = df[['班级','校排名']][df['校排名']<=i * 10].groupby('班级').count()
    for k,j in tmp.iteritems():
        d = dict(tmp[k])
        for u in d:
            print(d[u])
            分布.iloc[clss.index(u),i] = d[u]

写入文件

最后,就是写入到新的 excel 里了,指定另一个文件名,用来写入。

target = r'成绩统计.xls'
f = pd.ExcelWriter(target)
# 将统计信息追加到各表,写文件
final = df.append(app)
final.to_excel(f,sheet_name='学生总成绩', index=False)
for i,k in enumerate(clss):
    班级 = 班级成绩[i].append(班级统计[i])
    班级.to_excel(f,sheet_name=k, index=False)
# 四率写入
四率表.to_excel(f,sheet_name='四率',index=False)
# 分布写入
分布.to_excel(f,sheet_name='分布',index=False)
# 写入结束
f.close()

很好,打完收工。

小结

实战,才是学习最快的途径,碰到问题,分析问题,解决问题,一套流程下来,工具就能理解的七七八八了。

本次给小伙伴帮忙,算是大体上了解了 pandas 的 dataframe 对象,比如自带的聚合函数,比如可以按列筛选,比如 追加数据,比如 loc 与 iloc 的区别。

总之,多学多用,才能掌握的更好,小伙伴们,一起努力吧。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/509329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-admin-template中vue动态路由不显示问题解决

使用的的是vue-admin-template&#xff0c;这是一个极简的 vue admin 管理后台&#xff0c;它只包含了 Element UI & axios & iconfont & permission control & lint&#xff0c;这些搭建后台必要的东西。需要根据自己的需求二次开发。 线上地址:vue-admin-tem…

【操作系统】进程调度

目录 调度的概念 调度目标 所有系统 批处理系统 交互式系统 实时系统 调度算法 非抢占式调度算法 先来先服务 最短作业优先 非抢占式优先级调度 抢占式调度算法 最短剩余时间优先 轮转调度 抢占式优先级调度 多级反馈队列 彩票调度 公平分享调度 调度的概念 进程是资源分配…

Windows Nvm安装

前言 在windows系统下安装的是nvm-windows&#xff0c;nvm只支持安装在在Linux和Mac系统下。之前在Linux上安装过&#xff0c;最近在Windows上安装&#xff0c;特记录一下。 下载 下载地址&#xff1a;传送门 安装 双击exe文件&#xff0c;选定安装路径&#xff0c;下一步…

在外SSH远程连接macOS服务器【cpolar内网穿透】

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …

动态库和静态库的使用

一、什么是库&#xff1f; 库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码&#xff0c;相当于进行了加密&#xff0c;别人可以使用库&#xff0c;但是看不到库中的内容。 常见的库类型 共享库 静态库 动态库…

数据管理证书有哪些?DAMA-CDGA/CDGP含金量高

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

小度即将推出智能手机产品,醉翁之意意在何为?

5月8日&#xff0c;智哪儿从相关渠道获悉&#xff0c;小度即将于5月下旬发布首款智能手机产品。小度科技通过公开渠道确认了上述信息并透露将于下周披露更详细的产品信息。根据市场调查机构Counterpoint Research公布的最新报告&#xff0c;2023年第一季度全球智能手机市场出货…

巩飞:构建自治智能的数据库云管平台,加速国产数据库应用进程

导语 4月8日下午&#xff0c;为期两天的第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;在北京新云南皇冠假日酒店圆满落下帷幕。大会以“开源融合数字化——引领数据技术发展&#xff0c;释放数据要素价值”为主题&#xff0c;汇聚产学研各界精英到场交流。云和恩墨数…

什么是医学影像PACS系统?PACS系统功能有哪些?作用有哪些?对接哪些设备?业务流程是什么?

一、什么是医学影像PACS系统 PACS&#xff1a;为Picture Archive and CommunicationSystem的缩写&#xff0c;是图象归档和通讯系统。PACS系统应用在医院影像科室的系统&#xff0c;主要的任务就是把日常产生的各种医学影像&#xff08;包括核磁&#xff0c;CT&#xff0c;超声…

入门PyTorch的学习路线指南

PyTorch是目前最受欢迎的深度学习框架之一&#xff0c;它具有易于使用、灵活性强、支持动态图等优点&#xff0c;因此备受研究者和工程师的青睐。如果你想学习PyTorch&#xff0c;下面是一个入门PyTorch的学习路线。 学习基础知识&#xff1a; 学习Python编程语言&#xff1a;…

从入门到精通:教你如何使用Page Object模式提高WebUI自动化测试质量

目录 前言 什么是Page Object模式&#xff1f; 如何编写Page Object模式测试脚本&#xff1f; 步骤1&#xff1a;创建页面对象类 步骤2&#xff1a;编写测试用例 步骤3&#xff1a;运行测试用例 总结 前言 在进行Web应用程序开发的时候&#xff0c;我们经常需要进行自动…

前端工程化 搭建私有组件库 组件从开发到发布私有npm仓库的全过程

前言 基于Vue3.0 TS的组件从开发组件库到发布私有npm仓库的全过程 环境 这里列出本文所使用的环境版本 vue 3.0 vue/cli 4.5.9 nodeJs 14.15.1 npm 6.14.8 vue --version vue/cli 4.5.9 npm -v 6.14.8 node -v v14.15.1 步骤 创建项目 使用 vue-cli 创建一个 vue3 项目&a…

震坤行工业超市建设数字化采购供应链的实践

震坤行工业超市建设数字化采购供应链的实践 行业洞察&#xff1a; 【行业洞察】是震坤行工业超市新媒体推出的专注于行业思考主题栏目。 在这里&#xff0c;您可以收获&#xff1a;行业专家对于新理念、新模式、新技术的深度洞见&#xff0c;关于企业采购实操的干货分享。本…

OpenCL编程指南-1.1OpenCL简介

什么是OpenCL OpenCL是面向由CPU、GPU和其他处理器组合构成的计算机进行编程的行业标准框架。这些所谓的 “异构系统” 已经成为一类重要的平台&#xff0c;OpenCL是直接满足这些异构系统需求的第一个行业标准。OpenCL于2008年12月首次发布&#xff0c;早期产品则在2009年秋天…

数据可视化工具 - ECharts折线图的编写

1 官网找到类似实例&#xff0c; 适当分析&#xff0c;并且引入到HTML页面中 <!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>ECharts</title><!-- 引入刚刚下载的 ECharts 文件 --><script src"ech…

HTML与JavaScript联动

目录 一、数组&#xff08;增删查改&#xff09; 1.创建数组 2. 增加数组元素 3.删除数组中的元素 4.查看数组元素 5.修改数组元素 二、创建方法 1.函数 2.作用域 3.作用域链 三、对象 1.使用 字面量 创建对象 [常用] 2.使用 new Object 创建对象 四、JavaScript…

thinkphp报错 in_array() expects parameter 2 to be array, object given

我的问题是 foreach ($books as $k > $v) { if (in_array($v[id], $book_id)) { //这个地方报错的 $books[$k][check] checked; }else { $books[$k][check] ; } } 这个问题是因为 你的变…

5.9-5.10学习总结

项目分析&#xff1a; 1.用户共有的&#xff1a; 登录&#xff0c;注册&#xff0c;忘记密码&#xff0c;个人资料&#xff0c;修改密码 个人资料&#xff1a;包括生日&#xff08;日期栏选择&#xff09;&#xff0c;手机号&#xff0c;邮箱&#xff0c;学号&#xff0c;姓…

网络路径下倾斜模型生产流程-空三计算,像控刺点

网络路径下倾斜模型生产流程-空三计算&#xff0c;像控刺点 1.新建工程 ①新建工程文件夹 确定本机的网络路径&#xff0c;如演示机为192.168.100.10 在网络路径下新建工程文件夹&#xff0c;如//192.168.100.10/e/YNPE27 在工程文件夹下&#xff0c;新建工程存储文件夹CC和照片…

docker安装与配置docker镜像加速器

文章目录 前言一、准备工作二、docker安装三、配置镜像加速器1.配置中科大镜像加速器2.配置阿里云镜像加速器 前言 我真的受不了虚拟机了&#xff0c;我电脑上有9个虚拟机&#xff0c;占了132G&#xff01;&#xff01;&#xff01;我还不敢随便删&#xff0c;怕到时候要用。。…