前言
背景
前一阵,班级里面需要整一个互评活动。全班39个人每个人都需要填一个表格。如下
打分有一定的要求——不超过40%的优秀,不能超过40%的良好,不能少于20%的中等和一般,也就是说我们班39个人,最多给16个人打优秀,最多给16个人打良好,最少给8个人打中等或者一般。
还有就是不能同时给一个人打多个等级,就比如不能给一个人既打优秀,又打良好。同时还要保证对所有同学都进行了打分操作。
需求
(1)统计出班级中每个人的优秀、良好、中等、一般的票数。
(2)找出打分出现问题的同学。
注:非空都认为是对号。
解决问题
前期准备
python环境:Python 3.6.8
安装pandas库和xlwt库
我的pandas是1.0.3版本,xlwt是1.3.0版本
pip install xlwt==1.3.0
pip install pandas==1.0.3
思路
首先,通过glob库获取所有打分文件,其次,通过pandas库打开表格并进行统计,并且将出现问题的表格文件名打印出来,最后通过xlwt把统计结果保存到excel文件中。
运行前目录结构
- code.py
- file
-----同学1.xlsx
-----同学2.xlsx
-----同学3.xlsx
-----同学4.xlsx
……
-----同学39.xlsx
代码
# /code.py
import pandas as pd
from xlwt import *
import glob
#### 参数输入模块
errorlist = []
stunum = 39
maxyou = 16
minzhong = 8
#获取所有文件
filelist = glob.glob("file/*.xlsx")
#需要统计的表格头
target = ["优秀","良好","中等","一般"]
#表格头转index
index = {"优秀":0,"良好":1,"中等":2,"一般":3}
#count统计每个人的给某一等级的人的打分总数,主要判断是否合规
count = 0
#构建data数组,统计每个人获得的票数
data=[]
for i in range(stunum):
data.append([0]*len(target))
###### 统计模块
for file in filelist:
df = pd.read_excel(file)
flag = [0]*stunum
for line in df:
if (line not in target):
continue
if (line !="一般"):
count = 0
for j in range(len(df[line])):
if (pd.isnull(df[line][j])):
continue
data[j][index[line]] = data[j][index[line]]+1
if (flag[j]==0):
flag[j]=1
else:
if file not in errorlist:
errorlist.append(file)
count = count+1
if (count > maxyou and (line == "优秀" or line == "良好")) or (count < minzhong and line == "一般"):
if file not in errorlist:
errorlist.append(file)
for item in flag:
if item != 1 and file not in errorlist:
errorlist.append(file)
break
print("最终的统计数据为")
print(data)
# 写入数据
file = Workbook(encoding = 'utf-8')
#指定file以utf-8的格式打开
table = file.add_sheet('data')
for i in range(stunum):
for j in range(len(target)):
table.write(i,j,data[i][j])
file.save('all.xls')
print("填写出现问题的文件有")
print(errorlist)
运行结果
同时生成一个all.xls文件
如下
其顺序和文中第一个表的顺序相同,直接复制到第一个表中,如下,再略加修改格式,大功告成!
附录
有一个基础语法
l = [[0]*4]*39
l[1][0]=1
print(l)
最终所有的l[i][0](0i < 39)都变成了1,而不是仅仅l[1][0]变成了1
l = [0]*4
l[1]=1
print(l)
这种情况只是l[1]变成了1
保存为excel文件的另外几种方法
d = {
"年份":[i for i in range(1960,2050)],
"可再生能源消费总量/能源总量":Y1,
"人均可再生能源产生量(billion btu/per)":Y2,
"可再生购入占比":Y3,
"资源总支出与GDP比值":Y4,
"总可再生资源增长率":Y5
}
# Y1-Y5均为列表
import pandas as pd
writer = pd.ExcelWriter('tmp.xlsx')
# for key in fivedata:
df = pd.DataFrame(d)
df.to_excel(writer, sheet_name=sheet_name,index=False)
# 这里利用sheet_name制定表格的sheet名字
writer.close()