一、示例目的:由全院成绩单导出单个班级的成绩单
并且计算总分、平均分、按照总分排名。
下图为全院成绩单中一个同学本学年所有成绩;
需要使用的列有:班级、学号、姓名、课程名称、成绩、学分
下图为导出的班级成绩单
二、代码
第一次写,代码挺不简洁的,但是基本功能有的
import pandas as pd import warnings import openpyxl as op #student类 class student: def __init__(self, num): self.num = num #学号 self.name = None #姓名 self.course = [] #课程名称 self.grade = [] #课程成绩 self.credit = [] #课程学分 # self.gpa = [] #课程绩点 # def __str__(self): # return "".join(str(item) for item in ( # self.num, self.name, self.course, self.grade, self.credit, self.gpa # )) # 改变data的形式 def changeForm(stu, columns): list = [] for i in range(len(stu)): dict = {} dict[columns[0]] = stu[i]["num"] dict[columns[1]] = stu[i]["name"] sum = 0.0 for j in range(2,len(columns) - 2): temp = stu[i]['grade'][stu[i]['course'].index(columns[j])] if((temp == '作弊') or (temp == '缓考') or (temp == '缺考') or (temp == '不及格')): temp = 0 elif(temp == '优秀'): temp = 95 elif(temp == '良好'): temp = 85 elif((temp == '合格') or (temp == '中')): temp = 75 elif(temp == '及格'): temp = 65 dict[columns[j]] = float(temp) #各科成绩 sum = sum + float(temp) dict[columns[j + 1]] = sum #总分 dict[columns[j + 2]] = round(sum / (len(columns) - 4),2) #平均值:round四舍五入保留两位有效数字 list.append(dict) list.sort(key=lambda k: (k.get('总分', 0), k.get('学号', 1)), reverse=True) #排序:按照总分由大到小排序,若总分相同按学号由小到大排序 return list #保存数据为excel表格 def op_toExcel(dataLists, fileName, columns): # openpyxl库储存数据到excel wb = op.Workbook() # 创建工作簿对象 ws = wb['Sheet'] # 创建子表 ws.append(columns) # 添加表头 for dataList in dataLists: d = tuple(dataList.values()) ws.append(d) # 每次写入一行 wb.save(fileName) # 需要修改的位置 clas = 19070241 columns = ['学号', '姓名', 'Java高级程序设计', '计算机组成原理', '软件工程','数据库课程实验周','数据库原理及应用', '传感器原理及应用(RFID)','数值分析','工程训练C', ' *** 作系统', '总分', '平均分'] # 一、导入全院总成绩单 with warnings.catch_warnings(record=True): warnings.simplefilter('ignore', ResourceWarning) df = pd.Dataframe(pd.read_excel(r"2021-2022-1学期全院成绩.xlsx", engine="openpyxl")) # 二、处理表格 df1 = df[["班级","学号","姓名","课程名称","成绩","学分","绩点"]] data = df1[df1["班级"] == clas] # 得到指定班级的学生信息 numsList = list(dict.fromkeys(data["学号"].values.tolist())) temp = [] for num in numsList: stu = student(num) records = data[data["学号"] == num] stu.name = list(dict.fromkeys(records["姓名"].values.tolist()))[0] for record in records: stu.course = records["课程名称"].values.tolist() stu.grade = records["成绩"].values.tolist() stu.credit = records["学分"].values.tolist() temp.append(stu.__dict__) dataLists = changeForm(temp, columns) # 三、保存表格数据 fileName = str(clas) + '.xlsx' #表名 op_toExcel(dataLists, fileName, columns)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)