背景:来自于日常工作,针对医院行政人员统计日常门诊信息,手工统计繁琐、容易出错的问题,结合实际特点,采用python对数据进行自动统计。

具体步骤如下:

1.引入python工具包。

import pandas as pd
import glob
import datetime

2.读取文件夹中的所有xls文件,将其放置到DataFrame中,并将汇总表导出。

files=glob.glob(r"*.xls")
datas=pd.DataFrame()
for file in files:
data=pd.read_excel(file,header =1)
datas=pd.concat([data,datas])
datas.to_excel("Exportfiles/汇总.xls",encoding="gbk",index=0)

3.对DataFrame中的数据进行清洗,填充空值,去除不合理的、重复的项目。

data_res=datas
#数据清理
data_res=data_res[(data_res["病人性质"]!="门诊慢病")]
data_res=data_res[~(data_res["接诊医生"].isin(["管理员"]))]
#去除空格
data_res["姓名"]=data_res["姓名"].str.replace(" ","")
# #删除重复项
data_res.fillna("未知",inplace=True)
data_res_last=data_res.drop_duplicates(subset=["姓名","身份证号","就诊科室"])
data_res_last.to_excel("Exportfiles/清洗后.xls",encoding="gbk",index=0)

4.读取科室与医生对应表,创建待输出的DataFrame。

#每科的人数
#针对接诊医生
JieZhenDoc=data_res_last["接诊医生"].unique()
dataFrame=pd.DataFrame(columns=["科室","医生","总人数","无诊断人数","无日期人数","35岁以上人数","35岁以上未测血压人数"])
#获取医生与科室
DoctorKeShi=pd.read_excel("原始资料/医生一览表.xls",index_col=0,header =0)
DoctorKeShi=DoctorKeShi.reset_index()
DoctorKeShi["姓名"]=DoctorKeShi["姓名"].str.replace(" ","")

5.对病人年龄数据进行处理。

#根据身份证号提取年龄
def ExtractionAge(data):
Id=data["身份证号"]
if(len(Id)==18):
year=Id[6:10]
return datetime.datetime.now().year-int(year)
else:
return 101
data_res_last["年龄"]=data_res_last["年龄"].str.replace("岁","")
data_res_last["年龄"]=data_res_last["年龄"].str.replace("月","")
data_res_last["年龄"]=data_res_last["年龄"].str.replace("天","")
#df.loc[df['商品毛重'] > 10, '商品毛重'] = df.商品毛重 / 1000
data_res_last.loc[data_res_last["年龄"]=="未知","年龄"]=data_res_last[data_res_last["年龄"]=="未知"].apply(lambda x:ExtractionAge(x), axis = 1)
data_res_last["年龄"]=pd.to_numeric(data_res_last["年龄"])

6.针对各个大夫本月的各项指标进行统计。

for i in JieZhenDoc:
data=data_res_last[data_res_last["接诊医生"]==i]
ZongRenShu=data.shape[0]
WuZhenDuanRenShu=data[data["初步诊断"]=="未知"].shape[0]
WuRiQi=data[data["发病日期"]=="未知"].shape[0]
NianLingO35=data[(data["年龄"]>34)&(data["年龄"]<100)].shape[0]
NianLingO35WuXueYa=data[(data["年龄"]>34)&(data["年龄"]<100)&(data["血压"]=="未知")].shape[0]>0
if(DoctorKeShi["科室"][DoctorKeShi["姓名"]==i].count()>0):
Keshi=DoctorKeShi["科室"][DoctorKeShi["姓名"]==i].values[0]
if((Keshi=="产科一区" or Keshi=="产科二区")):
NianLingO35WuXueYa=data[(data["血压"]=="未知")].shape[0]
if(Keshi=="新生儿室"or Keshi=="儿科二区"or Keshi=="儿科一区"):
NianLingO35WuXueYa=0
dataFrame.loc[i]={"科室":Keshi,"医生":i,"总人数":ZongRenShu,"无诊断人数":WuZhenDuanRenShu,"无日期人数":WuRiQi,"35岁以上人数":NianLingO35,"35岁以上未测血压人数":NianLingO35WuXueYa}
else:
print(i)

7.对DataFrame中的多列进行数字化处理。

dataFrame[['总人数', '无诊断人数', '无日期人数', '35岁以上人数', '35岁以上未测血压人数']]=(dataFrame[['总人数', '无诊断人数', '无日期人数', '35岁以上人数', '35岁以上未测血压人数']]).apply(pd.to_numeric)

8.对未测量血压占比进行计算。

Result_deal=dataFrame
Result_deal["医生未测血压占比"]=Result_deal.apply(lambda x:DoctorRate(x), axis = 1)
def DoctorRate(x):
if(x["35岁以上人数"]==0):
return 0
else:
c=x["35岁以上未测血压人数"]/x["35岁以上人数"]
temp="%.2f%%" % (c * 100)
return temp
def DepartmentRate(x):
if(x["35岁以上人数"]==0):
return 0
else:
c=x["35岁以上未测血压人数"]/x["35岁以上人数"]
temp="%.2f%%" % (c * 100)
return temp

9.导出医生详细列表。

Result_deal.to_excel("Exportfiles/医生详细汇总.xls",encoding="gbk",index=0)

10.对科室详细信息进行统计。

Department_Res=Result_deal.groupby(["科室"]).sum().reset_index()
Department_Res["科室未测血压占比"]=Department_Res.apply(lambda x:DepartmentRate(x), axis = 1)
Department_Res.to_excel("Exportfiles/科室详细汇总.xls",encoding="gbk",index=0)

pandas小程序应用-实验的更多相关文章

  1. 采用pandas读取文件,进行自动化统计小程序

    自己完成的第二个自动化统计小程序,完成之后感觉:命名不够规范,造成可读性比较没那么好,幸好给自己很多地方都加了注释#coding:utf-8import os,sysimport reimport x ...

  2. 微信 公众号 小程序 授权 unionid 用户信息 实验总结

    -*-*-*-*-*-*-*-*-*--*-*-*-1.小程序通过code获取用户openid的接口,如果用户曾经授权并未过期,或者用户关注过同主体的公众号,会带回unionID,但没有用户头像等信息 ...

  3. 微信小程序开发初次尝试-----实验应用制作(一)

    初次尝试微信小程序开发,在此写下步骤以做记录和分享. 1.在网上找了很多资料,发现这位知乎大神提供的资料非常全面. 链接 https://www.zhihu.com/question/50907897 ...

  4. 天河微信小程序入门《四》:融会贯通,form表单提交数据库

    天河在阔别了十几天之后终于又回来了.其实这篇文章里的demo是接着(天河微信小程序入门<三>)后面就做了的,但是因为最近在做别的项目,所以就偷懒没有发出来.放到今天来看,从前台提交数据到数 ...

  5. 微信小程序实战笔记

    前言: 微信小程序最近刚从鹅厂生产出来,我有幸参与了一次小程序的实战,有必要记录我的开发过程.看上去小程序很简单,但是在深入开发的时候才能具体体会里面的变化,接下来记录我的第一个微信小程序的点点滴滴! ...

  6. Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

    前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...

  7. JWebFileTrans(JDownload): 一款可以从网络上下载文件的小程序(二)

    一  前言 本文是上一篇博客JWebFileTrans:一款可以从网络上下载文件的小程序(一)的续集.此篇博客主要在上一篇的基础上加入了断点续传的功能,用户在下载中途停止下载后,下次可以读取断点文件, ...

  8. JWebFileTrans(JDownload): 一款可以从网络上下载文件的小程序(三),多线程断点下载

    一 前言 本篇博客是<JWebFileTrans(JDownload):一款可以从网络上下载文件的小程序>系列博客的第三篇,本篇博客的内容主要是在前两篇的基础上增加多线程的功能.简言之,本 ...

  9. 小程序server-实现会话层

    小程序server-实现会话层开发教程: 1.安装MongoDB #安装 MongoDB及其客户端命令行工具 yum install mongodb-server mongodb -y #查看版本 m ...

随机推荐

  1. 【Mysql的那些事】数据库之ORM操作

    1:ORM的基础操作(必会) <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(* ...

  2. BZOJ 1934洛谷2057善意的投票题解

    题目链接 BZ链接 又是一道玄学的网络流题 我们这样建图: 对于同意观点1的原点向其连边,对于同一观点2点向汇点连边 然后如果两个人是朋友,就连一条双向边. 为什么这样是对的呢? 对于一个人来说,他要 ...

  3. sql查询报java.sql.SQLException: Column 'LC_ID' not found 的错误实际上是mysql在hibernate别名的问题

    报java.sql.SQLException: Column 'LC_ID' not found 的错误实际上是mysql在hibernate别名的问题 我的查询sql是 String sql2 =& ...

  4. Android GDI 图形渲染

      发布于2011-07-26   导读:对于Android开发者来说,成系列的技术文章对他们的技术成长帮助最大.如下是我们向您强烈推荐的主题为Android开发的第一个系列文章. <Andro ...

  5. 对比MySQL,一文看透HBase的能力及使用场景

    MySQL + HBase 是我们日常应用中常用的两个数据库,分别解决应用的在线事务问题和大数据场景的海量存储问题. 本文内容适合初次理解HBase的读者,包括技术.功能及场景,也欢迎老司机们补充和温 ...

  6. Oracle使用——varchar2() 和 char()关联查询 存在空格

    背景 表dbcontinfo 字段loanid,类型为varchar2(60) 表dbloanbal 字段loanid,类型为char(60) loanid字段实际长度为24位 问题 两张表dbloa ...

  7. css3 word-wrap属性

    允许长单词换行到下一行: word-wrap:break-word

  8. 原生js实现多个随机大小颜色位置速度小球的碰壁反弹

    文章地址 https://www.cnblogs.com/sandraryan/ 需求:生成n个小球,让他们在一个大盒子中碰壁反弹,要求小球随机颜色,大小,初始位置,运动速度. 思路分析: 创建小球随 ...

  9. nginx服务器究竟是怎么执行php项目

    https://jingyan.baidu.com/article/4f34706e3af779e387b56dc7.html CGI全称是“公共网关接口”(Common Gateway Interf ...

  10. thinkphp3.2如何自动生成后台模块并且怎么访问

    https://blog.csdn.net/whulovely/article/details/72773729 步骤一:在入口文件index.php下绑定Admin模块(这时候别再Home同级手动创 ...