查看原文
其他

实战演练——爱婴医院中莆田系医院数据分析(二)

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张馨月

文字编辑:余术玲

技术总编:张   邯


爬虫俱乐部将于2020年1月5日至11日湖北武汉举行为期一周的Stata编程技术定制培训,此次采取初级班和高级班分批次培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata软件编程、金融计量知识和实证分析方法,使大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。目前正在火热招生中~详细培训大纲及报名方式,请点击《爬虫俱乐部2020第一期Stata编程训练营开始报名啦!》或点击文末阅读原文呦~



在上一篇文章中已经介绍了如何获取我们所需的.docx文件,本篇文章将介绍具体的分析过程。
本文涉及的技术要点:
  提取word中的表格数据
  将所有word中的表格数据合并,导出至excel文件中
  数据之间进行匹配


一、提取WORD中的表格数据
1、导入docx库和pandas库,将WORD中的表格提取出来

打开一个WORD文件,可以发现医院名称和热线电话都存储于表格中,因此,我们使用docx库将WORD表格中的文字提取出来,程序如下:
import docximport pandas as pdfiles = os.listdir() #返回指定的文件夹包含的文件或文件夹的名字的列表。cc = 1 #定义一个循环算子,用于命名每一个WORD表格转换成的dataframe。for c in files: temp = []#定义一个空列表,用来存储表格中的信息。 doc = docx.Document(c) #这里的doc是一个句柄,用来操纵WORD。 for table in doc.tables:#假如有多个table,可以对table做循环。 i = 1 for row in table.rows:#对table中的每一行做循环。 print(len(table.rows)) i += 1
for cell in row.cells: print(cell.text) temp.append(cell.text.strip())
这个列表中按照顺序存储了表格中的所有信息,先是第一行第一列,再是第一行第二列,再是第一行第三列,再是第二行第一列,以此类推。然后,删除列表中的无用信息,例如“编码”、“医院名称”等。
list=['编码','编号','医院名称','母乳喂养热线电话','医院第一名称','母乳喂养热线电话号码']for inf in temp:     if inf in list: temp.remove(inf)
将列表中的数据清洗之后,将列表转换成dataframe,并使用错位相消的方法,将一个变量转换为和WORD中格式相同的三个变量。
data =pd.DataFrame(temp,columns=['ind']) #生成列名称为ind的列表data['name'] = data['ind'].shift(-1) #生成name一列,内容为ind列上移一行data['tel'] = data['ind'].shift(-2) #生成tel一列,内容为ind列上移两行data['tf'] = data.index % 3 == 0 #生成tf列,若索引值除3余0,返回trueexec("var{} = data.loc[data['tf'] == True]".format(cc)) #变量var1存储了第一个WORD文件中tf值为true的表格信息。cc += 1
2、将所有的DataFrame合并,并将数据导出到Excel
result = var1for nu in range(33): if nu > 1: exec("result =result.append(var{})".format(nu))#使用循环将32个DataFrame合并起来。final = result.drop(['tf'],axis = 1)final.to_excel('爱婴医院.xls',encoding='utf-8',index = False) #将数据存储在爱婴医院.xls中

结果如下:

爱婴医院的名单我们就整理好了。


二、将爱婴医院与“莆田系医院”匹配

小编从网上搜集了一份”莆田系医院”名单——“hospital”,使用DataFrame将两份名单横向合并并找出相同名字的医院,程序如下:
hospital =pd.read_excel('hospital.xlsx',header = 2)#从第三行开始读入,并将第三行设为变量名。baby_hos = pd.read_excel('爱婴医院.xls')hospital.rename(columns={'医院名称':'name'}, inplace=True)common =pd.merge(hospital,baby_hos,how = 'inner',on = 'name')#对hospital baby_hos进行合并,how表示取交集,on表示根据name进行合并

结果如下:

可见,在爱婴医院中,确实掺杂着几家“莆田系医院”,大家可要当心啦!

对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
      实战演练——爱婴医院中莆田系医院数据分析(一)

给你一个贴心的reshape应用

asrol命令——让你的描述性统计信息滚动起来
Python带你看文献—xpath抓取知网文献
您有一份天气预报待签收 
听说会Stata的人,数学不会太差?
批量修改路径
妙用正则表达式--Python中的re模块
豆瓣电影评分之数据爬取与可视化的实现 
为了辅导作业,这位家长竟然...
走进列表的世界——列表方法(二)
走进列表的世界——列表方法(一)
朝花夕拾|长宽数据转换——reshape命令
Stata有音乐包啦!
对《陈情令》的数据可视化分析
stata绘制热力图详解
实战演练-明星微博热搜次数的数据可视化

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存