我感觉帮别人处理数据就是做牛做马。
数据处理部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 |
import pandas as pd import numpy as np file = "治疗过程记录.xlsx" # 将第二行数据作为列名 df = pd.read_excel(file, header=1) # 按照住院号分组 grouped = df.groupby('住院号') # 合并住院号相同的数据 df_merged = pd.DataFrame() for i, [name, group] in enumerate(grouped): # 统计每个住院号的数据量 # 保留项目名称为 白细胞计数 的数据 selected1 = group[group['项目名称'] == '白细胞计数'].head(1).copy() # 参考警示 只要有一个 H 就视为 1 reference_range_alert = selected1['参考警示'] if 'H' in reference_range_alert.values: selected1['白细胞计数H警示'] = 1 else: selected1['白细胞计数H警示'] = 0 # 保留项目名称为 氯[CL] 的数据 selected_MTP = group[group['项目名称'] == '氯[CL]'] # 统计氯[CL]的平均值 selected1['氯[CL]'] = selected_MTP['定量结果'].mean() reference_range = [120, 130] # 高于参考值为 H,低于参考值为 L if selected1['氯[CL]'].values > reference_range[1]: selected1['氯[CL]警示'] = 'H' elif selected1['氯[CL]'].values < reference_range[0]: selected1['氯[CL]警示'] = 'L' else: selected1['氯[CL]警示'] = 'N' # 保留项目名称为 葡萄糖[Glu] 的数据 selected_Glu = group[group['项目名称'] == '葡萄糖[Glu]'] # 统计葡萄糖[Glu]的平均值 selected1['葡萄糖[Glu]'] = selected_Glu['定量结果'].mean() reference_range = [2.5, 4.5] # 高于参考值为 H,低于参考值为 L if selected1['葡萄糖[Glu]'].values > reference_range[1]: selected1['葡萄糖[Glu]警示'] = 'H' elif selected1['葡萄糖[Glu]'].values < reference_range[0]: selected1['葡萄糖[Glu]警示'] = 'L' else: selected1['葡萄糖[Glu]警示'] = 'N' # 合并数据 df_merged = pd.concat([df_merged, selected1]) # 改变索引为 range(len(df_merged)) df_merged.index = range(len(df_merged)) # 去掉无用的数据列[样板编号及其之后的数据列] df_merged = df_merged.drop(columns=[ '样本编号', '项目组名称', '项目编号', '项目名称', '定量结果', '定性结果', '结果单位', '参考值', '参考警示', '报告日期']) # 修改年龄列 从'xx岁'变为'xx' df_merged['年龄'] = df_merged['年龄'].str.replace('岁', '') # 将这一列数据转为整数 df_merged['年龄'] = df_merged['年龄'].astype(int) # 去掉 手术持续时间(h)为空的数据 df_merged = df_merged.dropna(subset=['手术持续时间(h)']) # 去掉 手术持续时间(h)为'-'的数据 df_merged = df_merged[~(df_merged['手术持续时间(h)'].str.contains('-'))] # 转换为数字 df_merged['手术持续时间(h)'] = pd.to_numeric(df_merged['手术持续时间(h)'], errors='coerce') df_merged['手术持续时间4'] = pd.to_numeric(df_merged['手术持续时间4'], errors='coerce') # 修改 index df_merged.index = range(len(df_merged)) # 增加两列 # 第一列为手术次数 # 第二列为手术总时间 col_lst = [] # 手术名称列 for i in range(4): col_lst.append('手术名称' + str(i+1)) # 统计手术次数 df_merged['手术次数'] = 0 for col in col_lst: df_merged['手术次数'] += df_merged[col].notnull() # 统计非空的数据 # 统计手术总时间 df_merged['手术总时间'] = 0 for i in ["手术持续时间(h)", "手术持续时间4"]: # 将数据转换为数值型 # 如果是 NaN 则转换为 0 now = df_merged[i].fillna(0) df_merged['手术总时间'] += now # 统计年龄小于 50 的病人 df_age_50 = df_merged[df_merged['年龄'] < 50] print('年龄小于50岁的病人有', len(df_age_50)) # 诊断数据列名 zd_lst = ['主要诊断'] + ['其他诊断' + str(i) for i in range(1, 11)] def get_zd(info: str, df: pd.DataFrame): # 返回诊断数据中是否含有这个症状 res: pd.Series = pd.Series([False] * len(df)) for i in zd_lst: res = res | df[i].str.contains(info) # 转换为 0 1 res = res.astype(int) return res # 在诊断数据中查找是否含有这个症状 zz_info = ['颅内感染', '高血压', '脑内出血', '脑脊液漏', '脑积水'] for i in zz_info: name = "是否" + i df_merged[name] = get_zd(i, df_merged) # 增加一列数据 是否含有这个症状 # 统计 氯[CL] 和 葡萄糖[Glu] 的警示 for st in "HLN": df_merged['氯[CL]' + st + '警示'] = (df_merged['氯[CL]警示'] == st).astype(int) for st in "HLN": df_merged['葡萄糖[Glu]' + st + '警示'] = (df_merged['葡萄糖[Glu]警示'] == st).astype(int) # 保存数据 df_merged.to_excel('处理后的数据.xlsx', index=False) # 分析开颅手术数据 df2 = df_merged.copy() # 开颅手术名称 ss_lst = '''脑内血肿清除术 硬脑膜补片修补术 颅骨去骨瓣减压术 大脑半球病损切除术 大脑深部病损切除术 鞍区病损切除术 经顶脑病损切除术 颞叶病损切除术 额叶病损切除术 小脑病损切除术 脑干病损切除术 大脑深部病损切除术 鞍区病损切除术 经蝶骨垂体病损切除术 额叶切除术 颞颞岛叶病损切除术 脑室Ommaya泵置入术 颅底病损切除术 后颅窝病损切除术 经额脑病损切除术 开颅探查术 颅骨修补术 ''' # 转换为列表 ss_lst = list(ss_lst.split('\n')) # 增加一列开颅手术次数 df2['开颅手术次数'] = 0 ss_info = ['手术名称' + str(i) for i in range(1, 5)] # 统计开颅手术次数 for i in ss_info: df2['开颅手术次数'] += df2[i].isin(ss_lst) # 增加一列有无开颅手术 df2['是否开颅手术'] = (df2['开颅手术次数'] > 0).astype(int) # 增加一列年龄小于50 df2['是否年龄小于50'] = (df2['年龄'] < 50).astype(int) # 统计颅内感染并且满足某条件的病人总数 for i in zz_info[1:] + ['开颅手术', '年龄小于50']: print('颅内感染 并且', i, '的病人总数:', (df2['是否颅内感染'] & df2['是否' + i]).sum()) # 统计颅内感染和性别的关系 for sex in [1, 2]: cnt_sex = len(df2[df2['性别'] == sex]) ganran_cnt = len(df2[(df2['是否颅内感染'] == 1) & (df2['性别'] == sex)]) print('性别:{} 一共有{}人,其中感染{}人'.format(sex, cnt_sex, ganran_cnt)) # 统计开颅手术次数和颅内感染的关系 for i in range(5): cnt1 = len(df2[(df2['是否颅内感染'] == 1) & (df2['开颅手术次数'] == i)]) cnt2 = len(df2[df2['开颅手术次数'] == i]) print('开颅次数为{}的病人中,感染的病人有{}人,总共有{}人'.format(i, cnt1, cnt2)) # 统计手术总时间和颅内感染的关系 maxlastTime = int(df2['手术总时间'].max()) # 分成 maxlastTime 个左闭右开的区间 for i in range(maxlastTime + 1): l, r = i, i + 1 cnt1 = len(df2[(df2['是否颅内感染'] == 1) & ( df2['手术总时间'] >= l) & (df2['手术总时间'] < r)]) cnt2 = len(df2[(df2['手术总时间'] >= l) & (df2['手术总时间'] < r)]) if cnt1 == 0 and cnt2 == 0: continue print('手术总时间在[{}, {})的病人中,感染的病人有{}人,总共有{}人'.format(l, r, cnt1, cnt2)) |
计算成绩
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import pandas as pd import numpy as np # 读取数据 file = './task/处理后的数据_4.xlsx' data = pd.read_excel(file) # 用于计算总分的最大值 maxValue = 1.098 # 保留住院号数据 res = pd.DataFrame(data['住院号']) # 保留1位小数 res['总分'] = np.round(data['data'] / maxValue * 100, 1) # 保存数据 res.to_excel('./task/处理后的数据_5.xlsx', index=False) |
发表回复