前言

背景

前一阵,班级里面需要整一个互评活动。全班39个人每个人都需要填一个表格。如下

python统计图表 python统计表格_python


打分有一定的要求——不超过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)

运行结果

python统计图表 python统计表格_python统计图表_02


同时生成一个all.xls文件

如下

python统计图表 python统计表格_文件名_03


其顺序和文中第一个表的顺序相同,直接复制到第一个表中,如下,再略加修改格式,大功告成!

python统计图表 python统计表格_python统计图表_04

附录

有一个基础语法

l = [[0]*4]*39
l[1][0]=1
print(l)

最终所有的l[i][0](0python统计图表 python统计表格_python_05i < 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()