最近接到一个需求,因为门诊数据表里的患者信息有大量的空值,会导致在后续数据处理及分析的过程中产生大的偏差,让我想办法把患者信息补全,借助深度的业务理解,很快就找到解决方案。针对该医院的实际运营状况,住院患者多是根据门诊患者产生的,根据患者的姓名、社保卡号可以锁定同一个人,那么开始上代码:
第一步数据读取准备工作:
import pandas as pd#分别读取住院字典表和门诊数据表data1 = pd.read_csv(\'C:\\\\Users\\\\glf\\\\Desktop\\\\测试医院\\\\住院字典表.txt\',encoding=\'gbk\')data2 = pd.read_csv(\'C:\\\\Users\\\\glf\\\\Desktop\\\\测试医院\\\\门诊数据表.txt\',names=[\'c0\',\'c1\',\'c2\',\'c3\',\'c4\',\'c5\',\'c6\',\'c7\',\'c8\',\'c9\',\'c10\',\'c11\',\'c12\',\'c44\'])#把读取到的数据框转换为listdata1 = data1.values.tolist()data2 = data2.values.tolist()#定义一个空列表res = []
住院字典表如图:
门诊数据表如图:
第二步业务逻辑实现:
#第一层循环遍历门诊数据表listfor i in data2: #第二层循环遍历住院字典表list for j in data1: #拿到每次循环遍历的下标值进行判断是否成立 if i[12] == j[1] and i[44] == j[2]: #条件成立,则把住院字典表里的值赋给门诊数据表 i[7] = j[0] #解决在excel表科学计数法的问题 i[7] = str(i[7]) +\'\\t\' #把成立的list追加在我们定义的res中 res.append(i) break else: #条件不成立,直接运行到这里然后进行追加 i[7] = str(i[7]) + \'\\t\' res.append(i)#最后调用pandas的DataFrame方法,把list重新转换为数据框并导出结果df = pd.DataFrame(res)df.to_csv(\'C:\\\\Users\\\\glf\\\\Desktop\\\\99.csv\',index=False,header=False)
关联结果输出如图:
回顾一下,会发现在这一个需求里考到了三个知识点:
1、list和DataFrame的相互转换,在这里呢我们可以直接调用python或者pandas的一些方法进行转换,这一点是不是要比java爽的多呢,哈哈哈哈。
2、嵌套循环,我们以门诊数据表为业务主表,在每次循环遍历门诊数据时,我们都会循环遍历住院字典表,判断住院字典表中是否满足和门诊数据表信息重叠的情况,成立的话,我们就进行赋值追加到res列表中,不成立的话,我们就直接进行追加。
3、科学计数法问题,在出现过长的纯数字时,在Excel数据表里会发生科学计数法的问题,我们可以把该字段给转换为字符串,在加上\\t(或者别的特殊字符),就ok了。