Python 与 Excel 表格综合实例:统计、分析2020年江苏省事业单位招聘岗位 Excel 表格信息
前言:
前面已经介绍了两个 Python xlrd、xlwt 模块处理 Excel 表格文件的实例,一个是侧重简单的文件读取、写入:给已有Excel表格添加序号、增加新列 ,另一个是侧重多个 Excel 表格文件的信息收集整个:汇总,分析大学校运会报名 Excel 表格 。
这篇博客将介绍第三个用 Python 处理 Excel 表格的实例,侧重于用 xlrd 模块 读取 Excel 表格数据 ,并 对数据进行统计分析 。
需求:
在工作中,经常会遇到许多 数据量、信息特别多的 Excel 表格 ,当想要从这些表格中查找数据,或进行数据统计及分析工作时,Excel 表格软件提供的功能可能就有点力不从心了。
如需对【江苏省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 数据结构有一个向上查找填充缺失值的方法,因还未介绍过 pandsa 模块,所以来 写一个函数,模拟向上查找填充缺失值方法,并对数据进行整理:
# 向上查找数据函数
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、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