|
10鱼币
这是原来的程序
- # coding=utf-8
- import pandas as pd
- import easygui as g
- import sys
- import os
- #选择原文件路径
- def get_file():
- confirm = g.ccbox(msg="程序简介 & 注意事项: \n\n 1.本程序可以根据Excel登分表一键生成九科总分排名以及单科排名。选择或保存文件时, 左上角会有提示,请注意左上角小标题。\n2.本程序设计初衷是为了分担老师们的排名统计工作,未经允许严禁用于商用。\n\n\n ⚬ 注意事项:登分表内必须有且仅有\n ‘考号’‘班别’‘姓名’‘语文’‘数学’‘外语’\n ‘物理’‘历史’‘生物’‘地理’‘政治’‘化学’。\n 但无需按照顺序排列,本程序会自动排序。\n\n\n\n 准备好后请单击“下一步”",
- title='学生成绩统计程序', choices=('下一步', '退出'))
- if confirm == True:
- file = g.fileopenbox(msg='', title='请选择登分表Excel文件',
- default=r'C:\\', filetypes=['*.xlsx'])
- if file == None or file == '.':
- sys.exit()
- else:
- return file
- else:
- sys.exit()
- #得到所有科目
- def get_subject(data):
- km = ['语文', '数学', '外语', '物理', '化学', '生物', '政治', '历史', '地理']
- all_subject = []
- for subject in data.columns:
- if subject in km:
- all_subject.append(subject)
- return all_subject
- #猎取单科数据 ID + 班别 + 姓名 + 本科目的成绩 + 排名
- def get_series(kem, orig, savep):
- with pd.ExcelWriter(savep) as writer:
- orig.to_excel(writer, sheet_name='所有科目')
- for i in kem:
- pm = i + '名次'
- df_dk = orig.loc[:, ['班别', '姓名', i, pm]]
- df_dk.sort_values(by=pm, inplace=True)
- df_dk.to_excel(writer, sheet_name=i)
- def edit_all(data1):
- for kemu in data1.columns[2:]:
- data1[kemu+'名次'] = data1[kemu].rank(method='min', ascending=False)
- data1['3科总分'] = data1['语文'] + data1['数学'] + data1['外语']
- data1['3科总分名次'] = data1['3科总分'].rank(method='min', ascending=False)
- data1['9科总分'] = data1.loc[:, '语文':'地理'].sum(axis=1)
- data1['9科总分名次'] = data1['9科总分'].rank(method='min', ascending=False)
- data1.sort_values(by="9科总分名次", inplace=True)
- data2 = data1.loc[:, ['班别', '姓名', '语文', '语文名次', '数学', '数学名次',
- '外语', '外语名次', '物理', '物理名次', '化学', '化学名次',
- '生物', '生物名次', '政治', '政治名次', '历史', '历史名次',
- '地理', '地理名次', '3科总分', '3科总分名次', '9科总分', '9科总分名次']]
- return data2
- excel_file = get_file()
- df1 = pd.read_excel(excel_file, index_col=0)
- df2 = edit_all(df1)
- allkm = get_subject(df1)
- sp = g.filesavebox(msg='请选择保存路径及输入保存文件名(注:默认为“成绩统计表”。不需要写后缀).',
- title='学生成绩统计程序', default=r'成绩统计表', filetypes=['*.xlsx'])
- spp = sp + '.xlsx'
- get_series(allkm, df2, spp)
- g.msgbox("文件保存成功,感谢您的使用!\n\n\n\n\n\n 更多功能正在开发中....\n\n\n\n\n 版本号:2020/12/23", '学生成绩统计程序')
复制代码
因为只能识别九科太过于机械,而且功能比较少太过于局限,现在我想改进一下:
1.给出任何科目都能一键生成成绩表,如果给出的科目在一个以上,除了主表外还额外生成这些科目的单科排名sheet。
2.以班为单位,额外生成这些科目的班级平均分排名、总分排名sheet。如:班级物理平均分 班级化学平均分 (给出的科目数)[x]科班级总分
(最好还能改进一下GUI,想生成什么科目的总分或者平均分就生成什么,不行的话就算了)
改进到一半卡壳了,请大佬指教一下,或者帮忙补全,谢谢!
- import pandas as pd
- #识别登分表中含有的科目
- data = pd.read_excel(r'D:\Desktop\登分表.xls')
- columns = list(data.columns)
- subjects_list = ['语文','数学','英语','日语','外语','物理','化学','地理','生物','政治','历史']
- subjects = [i for i in columns if i in subjects_list]
- #新增已有科目的单科排名sheet
- with pd.ExcelWriter(r'D:\Desktop\成绩统计.xls') as writer:
- data.to_excel(writer, sheet_name='所有科目')
- Personal_Information = columns.index(subjects[1])-1
- for i in subjects:
- rank = i +'单科排名'
- single_subject_ranking = data.loc[:,i]
- single_subject_ranking.sort_values(rank,inplace = True)
- single_subject_ranking.to_excel(writer,sheet = rank)
- sequence = []
- for i in subjects:
- data[i + '排名'] = data[i].rank(method='min', ascending=False)
- sequence.append(i,i+'排名')
- data['三科总分'] = data['语文'] + data['数学'] + data['英语']
- data['三科总分排名'] = data['三科总分'].rank(method = 'min',ascending = False)
- data[range(subjects) + '科总分'] = data.loc[Personal_Information:].sum(axis=1)
- data[range(subjects) + '科总分名次'] = data[range(subjects)].rank(method = 'min',ascending = False)
- data.sort_values(by= range(subjects) + "科总分名次", inplace=True)
复制代码 |
|