背景:来自于日常工作,针对医院行政人员统计日常门诊信息,手工统计繁琐、容易出错的问题,结合实际特点,采用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)

最新文章

  1. web开发前端学习
  2. HTTP协议状态码详解(HTTP Status Code)
  3. float塌陷有关问题
  4. HDU 5996:dingyeye loves stone(阶梯博弈)
  5. vijos 1776 关押罪犯
  6. js和jQuery创建元素和把元素插入到文档中所用的方法
  7. 堆栈帧的组织——C/C++内存管理必须掌握
  8. 转:drupal使用superfish建立下拉菜单
  9. 《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包
  10. Linux下配置APACHE支持PHP环境
  11. Android实用代码七段(三)
  12. DotNetCore跨平台~关于appsettings.json里各种配置项的读取
  13. ftp无法上传问题
  14. react-native 引入某些低三方库时出现的Command `run-android` unrecognized,命令不识别错误
  15. Vue项目使用bootstrap
  16. Spring Boot :邮件服务
  17. Python 实现红绿灯
  18. Introducing GitFlow
  19. Office 365 企业应用以及服务概览 分享记录
  20. Zookeeper+Curator 分布式锁

热门文章

  1. easyUI + servlet 展示datagrid数据列表
  2. 《js高级程序设计》6.1.1-6.1.3——数据属性、访问器属性
  3. AtCoder Beginner Contest 075 C bridge【图论求桥】
  4. day15 web前端之css
  5. iOS Animation 主流炫酷动画框架(特效)收集整理 #91
  6. Gym - 101480K_K - Kernel Knights (DFS)
  7. uva 11916 Emoogle Grid (BSGS)
  8. os.environ[&quot;CUDA_DEVICE_ORDER&quot;] = &quot;PCI_BUS_ID&quot; os.environ[&quot;CUDA_VISIBLE_DEVICES&quot;] = &quot;0&quot;
  9. 【Vue】基于nodejs的vue项目打包编译部署
  10. 2018-5-28-win10-uwp-动态修改ListView元素布局