Python统计DataFrame脓毒症患者数量并绘制柱状图
时间序列脓毒症数据集统计绘图实现
核心统计逻辑说明
- 患者唯一标识为
P_ID,判定规则:同一P_ID下只要存在任意一条SepsisLabel=1的记录,即判定为脓毒症患者,否则为非脓毒症患者 - 同一
P_ID对应的Gender字段值固定,聚合时取任意一条记录的性别值即可 - 禁止直接使用
drop_duplicates(subset='P_ID')取首行的逻辑,避免脓毒症患者早期标签为0导致的统计误差
需求1:两类患者总数统计柱状图
实现思路:按P_ID分组后对SepsisLabel取最大值,最大值为1即为脓毒症患者,0即为非脓毒症患者,自动统计计数后绘图。
import pandas as pd import matplotlib.pyplot as plt # 读取数据集,替换为实际数据读取路径,例如pd.read_csv('sepsis_dataset.csv') df = pd.read_csv('your_clinical_dataset.csv') # 按P_ID聚合,得到每个患者的最终脓毒症判定标签 patient_level = df.groupby('P_ID', as_index=False).agg( is_sepsis=('SepsisLabel', 'max') # 存在标签1则返回1,全0则返回0,完全匹配判定规则 ) # 自动统计两类患者数量 non_septic_count = (patient_level['is_sepsis'] == 0).sum() septic_count = (patient_level['is_sepsis'] == 1).sum() counts = [non_septic_count, septic_count] labels = ['Non-Septic patients', 'Septic patients'] # 绘制柱状图 fig = plt.figure(figsize=(7, 6)) ax = fig.add_axes([0,0,1,1]) ax.bar(labels, counts) ax.set_title("Septic and Non-septic patient count in the dataset", y = 1, fontsize = 15) ax.set_xlabel('Patients', fontsize = 12) ax.set_ylabel('Count', fontsize = 12) for bars in ax.containers: ax.bar_label(bars) ax.margins(y=0.1) plt.show()
需求2:分性别的分组柱状图
实现思路:按P_ID聚合时同时提取患者性别,之后交叉统计两类患者中的男女人数,绘制分组柱状图。
import pandas as pd import matplotlib.pyplot as plt import numpy as np # 读取数据集 df = pd.read_csv('your_clinical_dataset.csv') # 按P_ID聚合,同时得到患者的脓毒症标签和性别 patient_level = df.groupby('P_ID', as_index=False).agg( is_sepsis=('SepsisLabel', 'max'), gender=('Gender', 'first') # 同一患者性别固定,取第一条记录值即可,用max/min效果一致 ) # 分组统计各个人群数量 # 非脓毒症组 non_septic_female = ((patient_level['is_sepsis']==0) & (patient_level['gender']==0)).sum() non_septic_male = ((patient_level['is_sepsis']==0) & (patient_level['gender']==1)).sum() # 脓毒症组 septic_female = ((patient_level['is_sepsis']==1) & (patient_level['gender']==0)).sum() septic_male = ((patient_level['is_sepsis']==1) & (patient_level['gender']==1)).sum() # 绘制分组柱状图 group_labels = ['Non-Septic patients', 'Septic patients'] x = np.arange(len(group_labels)) bar_width = 0.35 fig, ax = plt.subplots(figsize=(9, 6)) rects_female = ax.bar(x - bar_width/2, [non_septic_female, septic_female], bar_width, label='Female (Gender=0)') rects_male = ax.bar(x + bar_width/2, [non_septic_male, septic_male], bar_width, label='Male (Gender=1)') ax.set_title('Septic/Non-septic patient count by gender', fontsize=15, y=1.02) ax.set_xlabel('Patient group', fontsize=12) ax.set_ylabel('Count', fontsize=12) ax.set_xticks(x, group_labels) ax.legend() ax.bar_label(rects_female) ax.bar_label(rects_male) ax.margins(y=0.1) plt.tight_layout() plt.show()
代码说明:聚合逻辑完全规避了首行标签为0的误判问题,适配任意规模的时间序列临床数据集,无需手动计数。
内容的提问来源于stack exchange,提问作者user17416440
相关产品推荐
相关产品推荐

