您的位置:首页 > 编程语言 > Python开发

关于一季青年大学习的反馈数据整理与统计(Python实现)

2020-05-16 23:31 288 查看

青年大学习的数据统计(Python实现)

工具:ANACONDA的Jupyter Lab

背景:老师给了青年大学习的后台数据的统计(是一个xlsx文件)
主要是提交的数据与后台反馈的数据有较大的出入,老师就想看看是哪些班级的人数不多。

数据准备:1,五四学习情况.csv 2,班级编号.csv

PS:建议把xlsx文件改成csv文件

import pandas as pd
order = pd.read_csv('五四学习情况.csv',encoding = 'ANSI',keep_default_na=False)
order.head()

keep_default_na=False
加上这个的原因:后续csv数据读取时,就不会出现nan的情况

姓名这一列的格式为:姓名+班级编号,班级编号+姓名
只不过在处理数据的过程中:也有出现不写名字的,还有加上班级名称的
这就需要额外的处理了,毕竟也不是所有人都按照你的格式来登陆的

l = []
for i in order['姓名']:
if i == '':
pass
else:
l.append(i)
len(l)

输出 890

PS:这跟pycharm等软件不同,不用写print语句,也能显示结果

check = pd.read_csv('班级编号.csv',encoding = 'ANSI',keep_default_na=False)
check.head()

PS:head()函数显行示数据的前五行,便于查看数据属性
l_class = []
l_id = []
for i in check['班级']:
l_class.append(i)
for j in check['班级编号']:
l_id.append(j)
在这里插入代码片
分别提取,班级列表,编号列表,用于合成班级-编号字典

第一个注意点:每个人填写姓名+班级编号时,格式不尽相同,提取时需要注意

l_1 = []
sign = ''
for i in l:
for j in i:
if j =='0' or j =='1' or j =='2' or j =='3' or j =='4' or j =='5' or j =='6'or j =='7'or j =='8' or j =='9':
sign+=j
l_1.append(sign)
sign =''
l_1[0:5]
显示前五个:[‘0721’, ‘0730’, ‘0721’, ‘0721’, ‘0730’] 实际上一共有890个数据,篇幅过长,只显示前五个 另外:本人算法也不是最好的算法,只是个人的一种方法,如有更好的方法,可以交流。貌似可以用Unicode试试
l_id_int = list(map(int,l_1))
l_id_int[0:5]
把每个元素变成 int 型
输出为:[721, 730, 721, 721, 730]

接下来开始统计32个班学习的人数信息

l_num = [0 for i in range(733)]
#先创建一共长度为732的列表,班级编号701-732,前面的0后续再处理
#这样做也是为了正好下标对应班级编号
for k in l_id_int:
if k >1000:
pass
if k in l_id:
l_num[k]+=1
#这里的k>1000是因为在处理时发现有个人的班级编号异常,数值较大,后续
#在对l_num求和为889,只有一个出现输入异常,找到之后,手动对该班级+1
l_num[719] +=1
l1 = []
l2 = []
for i in range(701,733):
l1.append(l_class[l_id.index(i)])
for j in range(701,733):
l2.append(l_num[j])
dic1 = dict(zip(l1,l2))
dic1
#统计班级——人数字典


一共32个班级,总人数统计为890

sum = 0
for i in range(701,733):
sum+=l_num[i]
sum
#输出890
l_x = []
l_y = []
for i in check['班级']:
l_x.append(i)
for j in check['班级编号']:
l_y.append('0'+str(j))
dict2 = dict(zip(l_x,l_y))
dict2
#制作班级名称-班级编号字典

dic3 = {
'0701':[],
'0702':[],
'0703':[],
'0704':[],
'0705':[],
'0706':[],
'0707':[],
'0708':[],
'0709':[],
'0710':[],
'0711':[],
'0712':[],
'0713':[],
'0714':[],
'0715':[],
'0716':[],
'0717':[],
'0718':[],
'0719':[],
'0720':[],
'0721':[],
'0722':[],
'0723':[],
'0724':[],
'0725':[],
'0726':[],
'0727':[],
'0728':[],
'0729':[],
'0730':[],
'0731':[],
'0732':[],
}
#创建字典,用于装填 姓名
x = ''
sig = ''
for i in l:
for j in i:
if j =='0' or j =='1' or j =='2' or j =='3' or j =='4' or j =='5' or j =='6'or j =='7'or j =='8' or j =='9':
sig+=j
else:
x+=j
if sig in dic3.keys():
dic3[sig].append(x)
x = ''
sig = ''
#算法与之前类似,一个用于存储编号,一个用于存储字符串,前文提到的一个同学格式#不规范,另作处理即可,如果不规范的人数太多,还需另作算法处理
dic3['0719'].append('XXX')

整理一下,创建的数据类型比较多,还是要理一理的,不然很容易脑子一片混乱。

名称 含义
dic3 字典:(键值对)存储班级编号:具体人员
dict2 字典:(键值对)存储 班级名:班级编号

下面需要生成32个班级信息的excel表格

file_name = []
for key,value in dict2.items():
for i in range(33):
file_name.append(key)
break
file_name[0]
#先定义好路径的名称,便于迭代文件名生成对应班级的excel表格
#输出为:'16计算机科学与技术'

以下是生成xlsx文件的函数

def display(url):
excelTabel= xlwt.Workbook()
sheet1=excelTabel.add_sheet(url + '.xlsx',cell_overwrite_ok=True)
sheet1.write(0,0,'实际学习人数')
sheet1.write(0,1,dic1[url])
sheet1.write(1,0,'以下为学习人员')
for i in range(len(dic3[dict2[url]])):
sheet1.write(i+2,1,dic3[dict2[url]][i])
excelTabel.save(url + '.xlsx')
for i in range(0,32):
display(file_name[i])
#循环打印 生成表格

效果展示

就不一一展示了,实际上确实也是32个文件

题外话:当我看到那么多excel文件时,内心是很激动的,可能第一次做这个比较耗时间(一下午吧)但是有了这些代码后,可以再进行后续整理,再需要统计时,就可以以很快的速度生成对应的文件。节省大量时间。这也只是笔者的一个小小的分享,学以致用的地方还是有很多的,做出来也是很有成就感的。与诸君共勉,谢谢!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: