前言:
因为作者所在的地方,需要每周整理全校的青年大学习数据,Excel操作本身不难,但是这种毫无意义的体力劳动做久了就会很无趣,刚好我想起来上学期接触过Python的Pandas模块,想着能不能试一下,取代这种无意义的劳动。
所用工具:
Pycharm 3.8(Python也可以)
Excel
Pandas库
Xlwt库
主要流程:
每周老师会发1M左右大小的.csv文件下来。
1.需要筛选出每个院有多少人看了。
2.再把每个院的团员数量填进去。
3.(每个院看了的人数)/(每个院的团员人数)=每个院的参与率
4.最底行再统计总人数和总参与率
这里城镇对应了学院
这是最终要的表格形式,此图的团员数量是后期调试方便随便输入的。本身操作不难,但每周总是得花点时间才能做完。
代码操作
之前上网查资料时,很多提醒打开文件的编码模式一定得是gbk,但我第一次的文件只能用UTF-8打开,但之后也有得用gbk才能打开的文件,这算是我踩过坑,大家知道就好。
#首先导入模块
import pandas as pd
import xlwt
#导入文件
data = pd.read_csv(r'C:\Users\ASUS\Desktop\第九季第十三期源数据.csv', encoding = "gbk",error_bad_lines=False) #导入文件 encoding = 'UTF-8'
#筛选“城镇”列
data_gender = data[[ '城镇']]
#删掉用不到的列
data_gender_re = data_gender[data_gender.notnull()] #删掉无用项
每周的团员数量都是在变化的,所以我决定用输入的方式来确定这个量
#这里定义了一个函数,用户输入每周的团员数量
def getdata():
liebiao1 = []
liebiao1.append(int(input("A院团员人数:")))
liebiao1.append(int(input("B院团员人数:")))
liebiao1.append(int(input("C院团员人数:")))
liebiao1.append(int(input("D院团员人数:")))
liebiao1.append(int(input("E院团员人数:")))
liebiao1.append(int(input("F院团员人数:")))
liebiao1.append(int(input("G院团员人数:")))
liebiao1.append(int(input("H院团员人数:")))
liebiao1.append(int(input("I院团员人数:")))
liebiao1.append(int(input("J团员人数:")))
liebiao1.append(int(input("K院团员人数:")))
liebiao1.append(int(input("L院团员人数:")))
liebiao1.append(int(input("M院团员人数:")))
liebiao1.append(int(input("N院团员人数:")))
liebiao1.append(int(input("O学院团员人数:")))
liebiao1.append(int(input("P院团员人数:")))
liebiao1.append(int(input("Q院团员人数:")))
return liebiao1
对“城镇”列的数据进行筛选,,将收集的数据传递给a(字典类型)
例如:a1={A:34} ,其中A是学院名称,34是数量
def screendata():
F1 = data_gender_re.loc[(data_gender_re['城镇'] == 'A学院团委')]
F2 = data_gender_re.loc[(data_gender_re['城镇'] == 'B工程学院团委')]
F3 = data_gender_re.loc[(data_gender_re['城镇'] == 'C学院团委')]
F4 = data_gender_re.loc[(data_gender_re['城镇'] == 'D学院团委')]
F5 = data_gender_re.loc[(data_gender_re['城镇'] == 'E学院团委')]
F6 = data_gender_re.loc[(data_gender_re['城镇'] == 'F学院团委')]
F7 = data_gender_re.loc[(data_gender_re['城镇'] == 'G学院团委')]
F8 = data_gender_re.loc[(data_gender_re['城镇'] == 'H学院团委')]
F9 = data_gender_re.loc[(data_gender_re['城镇'] == 'I学院团委')]
F10 = data_gender_re.loc[(data_gender_re['城镇'] == 'J学院团委')]
F11 = data_gender_re.loc[(data_gender_re['城镇'] == 'K学院团委')]
F12 = data_gender_re.loc[(data_gender_re['城镇'] == 'L学院团委')]
F13 = data_gender_re.loc[(data_gender_re['城镇'] == 'M学院团委')]
F14 = data_gender_re.loc[(data_gender_re['城镇'] == 'N学院团委')]
F15 = data_gender_re.loc[(data_gender_re['城镇'] == 'O学院团委')]
F16 = data_gender_re.loc[(data_gender_re['城镇'] == 'P学院团委')]
F17 = data_gender_re.loc[(data_gender_re['城镇'] == 'Q学院团委')]
#将字典a的信息传递给列表b
# A
a1 = dict(F1['城镇'].value_counts())
b1 = [list(a1) + list(a1.values())]
# B
a2 = dict(F2['城镇'].value_counts())
b2 = [list(a2) + list(a2.values())]
# C
a3 = dict(F3['城镇'].value_counts())
b3 = [list(a3) + list(a3.values())]
# D
a4 = dict(F4['城镇'].value_counts())
b4 = [list(a4) + list(a4.values())]
# E
a5 = dict(F5['城镇'].value_counts())
b5 = [list(a5) + list(a5.values())]
# F
a6 = dict(F6['城镇'].value_counts())
b6 = [list(a6) + list(a6.values())]
# G
a7 = dict(F7['城镇'].value_counts())
b7 = [list(a7) + list(a7.values())]
# H
a8 = dict(F8['城镇'].value_counts())
b8 = [list(a8) + list(a8.values())]
# I
a9 = dict(F9['城镇'].value_counts())
b9 = [list(a9) + list(a9.values())]
# J
a10 = dict(F10['城镇'].value_counts())
b10 = [list(a10) + list(a10.values())]
# K
a11 = dict(F11['城镇'].value_counts())
b11 = [list(a11) + list(a11.values())]
# L
a12 = dict(F12['城镇'].value_counts())
b12 = [list(a12) + list(a12.values())]
# M
a13 = dict(F13['城镇'].value_counts())
b13 = [list(a13) + list(a13.values())]
# N
a14 = dict(F14['城镇'].value_counts())
b14 = [list(a14) + list(a14.values())]
# O
a15 = dict(F15['城镇'].value_counts())
b15 = [list(a15) + list(a15.values())]
# P
a16 = dict(F16['城镇'].value_counts())
b16 = [list(a16) + list(a16.values())]
# Q
a17 = dict(F17['城镇'].value_counts())
b17 = [list(a17) + list(a17.values())]
#将列表b合并,此时data1是二维列表
data1 = b1 + b2 + b3 + b4 + b5 + b6 + b7 + b8 + b9 + b10 + b11 + b12 + b13 + b14 + b15 + b16 + b17
data2 = b1[0][1] + b2[0][1] + b3 [0][1] + b4 [0][1] + b5 [0][1] + b6 [0][1] + b7 [0][1] + b8 [0][1] + b9 [0][1] + b10 [0][1] + b11 [0][1] + b12 [0][1] + b13 [0][1] + b14 [0][1] + b15 [0][1] + b16 [0][1] + b17 [0][1]
#下面俩是上面表格中的最底下两行,不参与计数,以要求的形式存在
data1.append([])
data1.append(['总计',data2])
return data1
执行函数,将getdata返回的值给disanlie(第三列)
screendata()
disanlie = getdata()
将两个列表合并在一起(列与列的合并)
screendata1 = [list(screendata()[i]) + [disanlie[i]] for i in range(len(screendata())-2)]
计算出每个学院的参与率disilie(第四列,这里老师要求是百分比,且保留小数点后一位,后面会讲到)
disilie = []
for i in range(17):
disilie.append((float(screendata1[i][1])/(screendata1[i][2])))
将参与率disilie与上面整理的总表格合并(也是列与列的合并)
screendata2 = [list(screendata1[i]) + [disilie[i]] for i in range(len(screendata1))]
表格里的最后一行:参与人数总和、团员人数总和、总参与比,这里没什么好说的,注意数据别带错,简单的运算
canyurenshu = 0;tuanyuanrenshu = 0
for i in range(17):
canyurenshu = screendata2[i][1] + canyurenshu
tuanyuanrenshu = screendata2[i][2] + tuanyuanrenshu
canyubi1 = (canyurenshu / tuanyuanrenshu)
float(canyubi1)
#老师要求总参与比为百分比,且小数点后两位(百分比后面再处理)
canyubi = ("%.2f%%" %(canyubi1*100))
表格中倒数第二行是空的,所以准备一个空列表,并将之前算好的数据全装进第二个列表。
zongjie1 = []
zongjie2 = ['总计',canyurenshu,tuanyuanrenshu,canyubi]
然后将上面准备好的最底两行与总表格合并
screendata2.append(zongjie1)
screendata2.append(zongjie2)
老师还要求(我内心其实是崩溃的~)学院按参与率由高到低排序,我这里采用了sorted函数,用key关键字进行排序,非常方便
screendata3=[]
for i in range(17):
screendata3.append(screendata2[i])
screendata4 = sorted(screendata3,key=lambda x: x[3],reverse=True)
#这里将学院的参与率由float型转为小数点后一位的百分比
for i in range(17):
screendata4[i][3] = str("%.1f" % (screendata4[i][3]*100)) + '%'
screendata4.append(zongjie1)
screendata4.append(zongjie2)
最后生成Excel文件,大功告成
#pd.DataFrame(列表,每一列的列头)
df = pd.DataFrame(screendata4, columns=['学院','参与人数','团员人数','参与比'])
df.to_excel(r'C:\Users\ASUS\Desktop\导出文件.xls',index=False,encoding = 'UTF-8')
第一次写这么长的文章,写的不好,代码太乱也没有整理,将就看着,下面写下一些我遇到的坑。
1.到后面已经可以生成文件了,如果Excel还开着,就Run程序,这个肯定会报错
2.编码问题,有些时候UTF-8才能运行,有时候gbk才能运行,不过基本上都是gbk才能运行
3.列表的行数、列数,思考调试列表的位置把我弄傻了都…
4.pd.DataFrame函数的columns是以一个列表的形式出现。你传入的列表数有n列,那么columns列表的元素就不能超过n
5.如果你保存的是.csv格式,那么你的小数点后一位的百分比格式,生成为.csv的时候,会自动给你多保留一位小数点,于是乎我才选择导入xlwt模块生成Excel文件