用Python 统计、分析2020年江苏省事业单位招聘岗位 Excel 表格信息
该文为一篇关于Python与Excel表格综合应用的文章示例题解报告,在内容上主要介绍了利用Python语言对江苏省2020年事业单位招聘岗位电子表格数据信息进行统计与分析的具体方法与步骤
文章开头通过设定场景的方式引出主题:在实际工作中面对大量零散的数据记录时往往难以快速完成数据汇总任务
引言:
具体需求:
主要思路和实现步骤:
1. 获取并整理原始数据
2. 对原始数据的基础情况进行分析
3. 根据特定条件筛选并进行数据分析
4. 综合评估原始数据特征
5. 存储处理后的结果文件
* 结尾
* 【Python与Excel表格】专栏
前言:
之前已讲述了这两种Python xlrd/xlwt模块在处理Excel文件方面的具体应用情况:一种专注于基本的数据读取与撰写操作——如在现有Excel表中添加编号及新增列;另一种则集中于从多个Excel文件中提取并整合数据——如统计第十四届校运会的报名信息等详细流程。相关案例可参考以下链接进一步了解完整操作流程:给已有Excel表格添加序号、增加新列 和 汇总, 分析大学校运会报名 Excel表格 。
这篇博客将阐述第三个Python处理Excel表格的具体案例,并详细说明使用xlrd模块来提取Excel表格中的数据以及对这些数据进行统计分析的过程。
需求:
在工作中常见的是很多数据量和信息丰富的 Excel 表格 。当需要从这些表格中查找数据或进行统计分析时,在处理这类任务时 Excel 的功能可能就显得力不从心了。
江苏省2020年省属事业单位统一公开招聘岗位表
江苏省2020年省属事业单位统一公开招聘岗位表(包括招聘人数、学历要求等)
请通过以下链接进行表格文件的浏览:下载链接

这个表格大约包含600多条数据记录。实际上这些数据的数量并不多当处理超过成千上万张由Excel生成的文档时单独依赖于Excel自带的功能进行数据分析会显得力不从心。
模拟案例:统计、分析2020年江苏省事业单位招聘岗位表格信息
总体需求:
- 数据提取:从表格中获取数据后进行处理;
- 基本统计:
A: 总的招聘信息数量;
B: 分析岗位招聘情况:- 最高与最低的招聘人数;
- 招聘人数分布(如1人、2人等岗位的数量);
C: 统计不同人员群体的需求: - 社会人员、本科生群体及不限人群的数量及其占比;
- 条件筛选:
A: 符合计算机科学相关专业的应届毕业生招聘信息;
B: 统计符合条件职位及人员数量,并计算其占总招聘信息的比例;
C: 统计学历要求分布:- 中专生、大专生、本科生、硕士生及博士生在符合条件职位中的数量及其占比;
- 综合分析:
A: 计算各部门总的招聘信息量及其占总招聘信息的比例;
B: 找出需求最多的及最少的部门;
C: 分析各主管部门对不同人员群体的需求情况及其内部占比; - 输出结果:将上述分析结果以Excel文件形式保存至新文件夹中。
主要思路及实现代码:
1、读取、整理数据:
满足后续分析需求的数据被视为每项数据分析工作的必要前提,在此过程中依仗数据的读取与整理作为基础步骤进行操作
用 xlrd 模块读取文件数据:
import xlrd
import xlwt
work_book = xlrd.open_workbook('sample3.xls')
sheet = work_book.sheet_by_index(1) # 注意下载的文件有隐藏的一个sheet表单
all_data = sheet._cell_values[3:] # 按行读取表格数据
打印下数据:
for ds in all_data:
print(ds)
打印截图:

注意

数据整理:
由于单元格合并导致的数据读取存在不完整性,在Python的数据分析库pandas中DataFrame结构中提供了向上查找填充缺失值的功能。然而由于尚未介绍pandas模块的相关知识, 我们决定编写一个函数模拟这一功能,并对其进行相应的整理工作
# 向上查找数据函数
def fill(i,j,data_list):
up_index = i -1
for c in range(i):
if data_list[up_index][j] != '':
return data_list[up_index][j]
else:
up_index -= 1
# 模拟pandas里DataFrame对象中向前填充的功能:
for i,ds in enumerate(all_data):
for j,d in enumerate(ds):
if d == '':
ds[j] = fill(i,j,all_data)
# 打印数据:
for ds in all_data:
print(ds)
打印截图:

从上面的截图可以看出数据被补充完整了。
2、数据基础分析:
需求:
- 整体招聘岗位规模及人员配置情况包括以下指标:包括整体招聘岗位数量(总岗数)、整体招聘人员规模(总人岗比)以及各岗位在用人需求上的差异性(最高岗额与最低岗额)。
- 在岗位分布中:具体表现为各岗位所需招聘人数与单位数量之间的对应关系。
- 招聘对象涵盖的社会群体包括社会在职人员、高校毕业生以及不限制范围的人群等具体情况,并根据不同类别人群的需求占比进行分类统计。
收集并经过整理的数据即可开始开展数据分析工作;依次逐一地实现上述数据基础分析的具体需求。
1、总招聘岗位数,总招聘人数,岗位最大、最小招聘人数:
# 招聘岗位数
total_post = len(all_data)
print(total_post) # 580
# 总招聘人数
total_employs = sum([int(ds[9]) for ds in all_data])
print(total_employs) # 708
# 最大的招聘人数
max_employ = max([int(ds[9]) for ds in all_data])
print(max_employ) # 10
# 最小招聘人数
min_employ = min([int(ds[9]) for ds in all_data])
print(min_employ) # 1
在上述代码中运行后进行分析显示,在本段程序中总共统计出了以下数据结果:其中总共提供了580个就业岗位,并累计吸引了708人求职。根据分析报告中的具体数据指标可以看出,在当前的数据范围内各岗位的需求情况如下:其中最多的一个岗位需求量达到10人/月,并且还有一个特别突出的岗位仅需1人/月来完成职责要求。
整个江苏省事业单位才招聘708个,好像不是特别多的样子…
2、岗位招聘人数分布情况:
# 分析岗位招聘人数分布情况
# 先获取有多少招聘个数种类
number_employ = set([int(ds[9]) for ds in all_data])
print(number_employ) # {1, 2, 3, 4, 5, 7, 9, 10}
# 获取每个招聘数量的岗位数量
# 建立字典
ne_dict = {key:0 for key in number_employ}
print(ne_dict)
# {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 7: 0, 9: 0, 10: 0}
for ds in all_data:
if ds[9] in ne_dict.keys():
ne_dict[ds[9]] += 1
print(ne_dict)
# {1: 497, 2: 61, 3: 15, 4: 2, 5: 2, 7: 1, 9: 1, 10: 1}
代码运行后显示:招聘人数为1的岗位共有497个岗位;其中招聘人数为2的人岗共有61个;招聘人数为3的人岗共有15个;而招聘人数在4及5之间的人岗则只有2个;最后统计数据显示:招聘人数达到7人及以上的岗位仅有3人
3、招聘对象为社会人员、应届毕业生、不限的各自数量,及所占比例:
# 分析招聘对象数据
# 建立不同招聘对象数量数据
employ_type = {'社会人员': [0,0] ,'应届毕业生': [0,0] ,'不限': [0,0]}
# 遍历所有招聘信息将对应的招聘人数统计至建立的招聘对象数据信息
for ds in all_data:
if ds[13] in employ_type.keys():
employ_type[ds[13]][0] += int(ds[9])
# 计算占比
sum_employ = sum([employ_type['社会人员'][0],
employ_type['应届毕业生'][0],
employ_type['不限'][0],
])
for vs in employ_type.values():
vs[1] = str(round(vs[0]/sum_employ * 100,2)) + '%'
print(employ_type) # 打印统计数据
# 打印结果
# {'社会人员': [105, '14.83%'], '应届毕业生': [517, '73.02%'], '不限': [86, '12.15%']}
社会招聘人员为105,14.83 % ,应届毕业生招聘数量为 517 ,73.02 % 。
3、按条件查找分析数据:
需求:
- 该招聘信息的专业领域涉及计算机相关领域,并以应届毕业生作为主要应聘群体;
- 统计数据显示在特定条件下, 岗位空缺数量与实际录用人数及其占全部招聘信息的比例得到了详细记录;
- 根据学历要求的不同类别进行统计分析, 具体包括中专、大专、本科、硕士及博士五个层次, 分别对应多少岗位空缺数量?以及每个层次下实际录用人数及其占比情况如何?
1、先按查找条件,筛选出对应数据:
# 联合查找,有多个条件:
s1_data = [data for data in all_data
if '计算机' in data[12] and data[13] == '应届毕业生']
# 测试查找数据
for ds in s1_data:
print(ds)
打印截图:

2、统计条件下招聘的岗位数,招聘人数,及两者在全部招聘信息中所占比例:
# 招聘岗位数、招聘人数
s1_post,s1_employs = len(s1_data),sum([int(data[9])
for data in s1_data])
print(s1_post,s1_employs)
# 打印结果:
# 60 75
# 招聘岗位数、人数在全部招聘信息中占比
s1_post_ratio,s1_employs_ratio = (round(s1_post/total_post * 100, 2),
round(s1_employs/total_employs * 100, 2))
print(s1_post_ratio,s1_employs_ratio)
# 打印结果:
# 10.34 10.59
在计算机相关专业及应届毕业生中提供的职位数量为60,在所有这些职位与总的求职者人数比例方面,则分别计算得出10.34%及10.59%的数值。
3、统计条件下学历要求情况:
# 统计学历要求情况:招聘岗位数,招聘人数
s1_academic = {'中专': [0,0], '大专': [0,0], '本科': [0,0],
'硕士': [0,0], '博士': [0,0]}
for data in s1_data:
for key in s1_academic.keys():
if key in data[11]:
s1_academic[key][0] += 1
s1_academic[key][1] += int(data[9])
# 统计占比情况:
for value in s1_academic.values():
value.append(round(value[0]/s1_post* 100, 2))
value.append(round(value[1]/s1_employs* 100, 2))
print(s1_academic) # 打印数据
# ------运行结果------
# {'中专': [0, 0, 0.0, 0.0], '大专': [6, 7, 10.0, 9.33],
# '本科': [24, 29, 40.0, 38.67], '硕士': [29, 38, 48.33, 50.67],
# '博士': [1, 1, 1.67, 1.33]}
# ------运行结果------
注:针对该公司的招聘岗位而言,在统计各岗位所需学历要求时,默认考虑了各岗位所需的最低层次教育程度。
4、综合分析:
需求:
- 收集与各主管部门相关的招聘信息数量,并计算其在全部招聘信息中的占比情况。
- 考察最高与最低的招聘信息量所属的具体部门。
- 考察各个主管部门在招聘信息中所涉及的人才类型及其各自所占的比例分布情况。
1、统计各主管部门招聘人数,占总招聘人数比例:
先获取招聘的主管部门:
# 分析各个主管部门招聘人数
# 统计招聘的主管部门
manages = set([i[1] for i in all_data ])
print(manages) # 打印获取数据
# {'江苏省卫生健康委员会', '江苏省应急管理厅', '江苏省文化和旅游厅',
# '江苏省委老干部局', '江苏省委党校', '江苏省委办公厅', '江苏省人力资源和社会保障厅',
# '江苏省地方志办公室', '江苏省社会科学院', '江苏省人民政府外事办公室', '江苏省科学技术厅',
# '江苏省住房和城乡建设厅', '江苏省委统战部', '江苏省交通运输厅', '江苏省发展和改革委员会',
# '江苏省市场监督管理局', '江苏省商务厅', '中国民用航空江苏安全监督管理局', '江苏省总工会', '
# 江苏省地方金融监督管理局', '江苏省统计局', '江苏省工业和信息化厅', '江苏省人民防空办公室',
# '江苏省文学艺术界联合会', '江苏省供销合作总社', '江苏省残疾人联合会', '江苏省政务服务管理办公室',
# '江苏省农业科学院', '江苏省退役军人事务厅', '江苏省设备成套有限公司', '江苏省机关事务管理局',
# '江苏省纪委监委机关', '江苏省公安厅', '江苏省科学技术协会', '江苏省中国科学院植物研究所',
# '江苏省药品监督管理局', '江苏省体育局', '江苏省教育厅', '江苏省生态环境厅', '江苏省民政厅',
# '江苏省档案馆', '江苏省水利厅', '江苏省作家协会', '江苏省政协办公厅', '江苏省人大常委会办公厅',
# '江苏省委宣传部', '江苏省财政厅', '江苏省通信管理局'}
建立初始数据,统计数据:
# 建立主管部门招聘人数数据
employ_manages = {key:[0,0,0,0,0] for key in manages}
# 统计数据
for ds in all_data:
if ds[1] in employ_manages.keys():
employ_manages[ds[1]][0] += int(ds[9])
# 计算比例
for key in employ_manages.keys():
employ_manages[key][1] = round(employ_manages[key][0] / total_employs*100,2)
print(employ_manages)
解析:
这里的部门统计信息: employ_manages = {key:[0,0,0,0,0] for key in manages} 该字典中的键设定为各部分的名称;值设为此字典中的列表项;包括五个指标分别是:招聘人数、社会人员招聘比例、社会人员招聘人数、应届毕业生招聘比例以及不限岗位。
部分数据截图:

2、分析最大、最小招聘人数部门:
# 先查找部门最大招聘人数与最小招聘人数
max_me = max([employ_manages[key][0] for key in employ_manages.keys()])
min_me = min([employ_manages[key][0] for key in employ_manages.keys()])
print(max_me,min_me) # 186 1
# 查找最大招聘人数、最小招聘人数部门, 可能有多个
max_manages = [key for key in employ_manages.keys()
if employ_manages[key][0] == max_me]
min_manages = [key for key in employ_manages.keys()
if employ_manages[key][0] == min_me]
print(max_manages,min_manages)
# 打印结果:
# ['江苏省卫生健康委员会'] ['江苏省委统战部', '江苏省通信管理局', '江苏省中国科学院植物研究所', '江苏省商务厅', '江苏省档案馆', '江苏省设备成套有限公司']
根据主管部门分类,在招聘数量最多的单位中是:江苏省卫生健康委员会 ,其招聘人数达到了 186 人。也可能是受疫情影响导致的。
3、分析每个主管部门招聘对象:
考察各个主管部门在招聘对象上的设置情况包括社会人员、应届高校毕业生以及不设人数限制者等构成情况。
# 统计各部门招聘 社会人员、应届毕业生、不限 人员数量
e_type = ['社会人员','应届毕业生','不限']
for ds in all_data:
for key in employ_manages.keys():
if key == ds[1]:
for i,type_ in enumerate(e_type):
if ds[13] == type_:
employ_manages[key][2+i] += int(ds[9])
# 计算内部占比:
for value in employ_manages.values():
for i in range(2,5):
value.append(round(value[i]/value[0]*100,2))
print(employ_manages)
部分数据截图:

5、保存数据
在完成数据提取与分析后
# 新建Excel文件、写入数据
# 整理统计分析数据:基础数据
info1 = {'总招聘岗位数':total_post,
'总招聘人数':total_employs,
'最大招聘人数':max_employ,
'最小招聘人数':min_employ}
# 新建Excel表格 写入分析数据:
new_work = xlwt.Workbook() # 新建Excel工作簿
new_sheet = new_work.add_sheet('统计分析数据') # 创建sheet表
# 写入数据:
new_sheet.write_merge(0,0,0,5,'江苏省2020年事业单位招聘岗位表分析结果')
# 写入基础分析数据
row_no = 1
for key,value in info1.items():
new_sheet.write(row_no,0,key)
new_sheet.write(row_no,1,value)
row_no += 1
# 岗位人数分布情况:
new_sheet.write_merge(row_no+1,row_no+1,0,2,'岗位招聘人数分布情况:')
new_sheet.write(row_no+2,0,'招聘人数')
new_sheet.write(row_no+2,1,'岗位数量')
row_no += 3
for key,value in ne_dict.items():
new_sheet.write(row_no,0,key)
new_sheet.write(row_no,1,value)
row_no += 1
# 写入社招、应届毕业生招聘人数及比例数据
new_sheet.write_merge(row_no+1,row_no+1,0,3,'招聘对象分布及比例:')
new_sheet.write(row_no+2,0,'招聘对象')
new_sheet.write(row_no+2,1,'招聘数量')
new_sheet.write(row_no+2,2,'百分比(%)')
row_no += 3
for key,value in employ_type.items():
new_sheet.write(row_no,0,key)
new_sheet.write(row_no,1,value[0])
new_sheet.write(row_no, 2, value[1])
row_no += 1
# 计算机相关专业、应届毕业生招聘情况数据
info2 = {'招聘岗位数':[s1_post,s1_post_ratio],
'招聘人数':[s1_employs,s1_employs_ratio]}
new_sheet.write_merge(row_no+1,row_no+1,0,3,'计算机相关专业应届毕业生招聘信息分析')
new_sheet.write(row_no+2,0,'项目')
new_sheet.write(row_no+2,1,'数量')
new_sheet.write(row_no+2,2,'百分比(%)')
row_no += 3
for key,value in info2.items():
new_sheet.write(row_no,0,key)
new_sheet.write(row_no,1,value[0])
new_sheet.write(row_no, 2, value[1])
row_no += 1
# 学历分布情况:
new_sheet.write_merge(row_no+1,row_no+1,0,3,'学历分布信息:')
new_sheet.write(row_no+2,0,'最低学历')
new_sheet.write(row_no+2,1,'岗位数')
new_sheet.write(row_no+2,2,'招聘人数')
new_sheet.write(row_no+2,3,'岗位数百分比')
new_sheet.write(row_no+2,4,'人数百分比')
row_no += 3
for key,value in s1_academic.items():
new_sheet.write(row_no,0,key)
new_sheet.write(row_no,1,value[0])
new_sheet.write(row_no, 2, value[1])
new_sheet.write(row_no, 3, value[2])
new_sheet.write(row_no, 4, value[3])
row_no += 1
# 综合分析数据
new_sheet2 = new_work.add_sheet('部门招聘信息分析')
new_sheet2.write_merge(0,0,0,5,'招聘岗位表部门招聘信息分析结果')
row_label = ['主管部门','招聘人数','占比(%)','招聘社会人员数量',
'招聘应届毕业生数量','不限人员数量',
'社会人员比例','应届毕业生比例','不限比例']
for col,label in enumerate(row_label):
new_sheet2.write(1,col,label)
row_no2 = 2
for key,value in employ_manages.items():
new_sheet2.write(row_no2,0,key)
for col,v in enumerate(value):
new_sheet2.write(row_no2,col+1,v)
row_no2 += 1
# 保存文件
new_work.save('analysis_info.xls')
保存的Excel文件信息如下:
基础分析数据:

综合分析数据:

结尾
这些是我博客的主要内容;其中的核心在于数据分析环节;而获取数据以及处理过程相对直接;这也是我们Python学习系列的最后一章,在Excel相关内容后展开讨论;感谢您的阅读
Python与Excel表格
