You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 03:09:28