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

如何基于Pandas DataFrame中患者既往预约计算爽约率?

问题:修正计算患者既往预约爽约率的代码

背景与需求

  • 使用包含巴西医疗预约信息的数据集,字段涵盖预约ID、患者ID、预约日期时间、挂号日期时间等,核心字段No-show标记患者是否爽约。
  • 需要新增一列no_show_rate,表示当前预约对应的患者既往预约爽约率:
    • 首次预约的爽约率为0;
    • 若患者已有N次既往预约,其中M次爽约,则当前预约的爽约率为M/N。

原代码问题

原代码在计算时错误将当前预约纳入了统计范围,导致爽约率计算不符合需求。例如查看患者ID为112397157856688.0的排序后数据,可直观发现该问题。

原代码如下:

# convert appointment and scheduled dates to datetime format
df['AppointmentDay'] = pd.to_datetime(df['AppointmentDay'])
df['ScheduledDay'] = pd.to_datetime(df['ScheduledDay'])

# create a new column with the time difference between scheduled and appointment date
df['time_diff'] = (df['AppointmentDay'].dt.date - df['ScheduledDay'].dt.date).dt.days

# group by PatientId and calculate no-show count and appointment count for each group
grouped = df.groupby('PatientId')['No-show'].apply(lambda x: x.eq('Yes').cumsum().shift().fillna(0))
df['no_show_count'] = grouped
df['appointment_count'] = grouped + df.groupby('PatientId').cumcount()

# calculate no-show rate for each patient
df['no_show_rate'] = df['no_show_count'] / df['appointment_count']

# replace NaN values in 'no_show_rate' column with 0
df['no_show_rate'] = df['no_show_rate'].fillna(0)

# print first 5 rows
print(df.head())

修正后的代码

# 转换日期列为datetime格式
df['AppointmentDay'] = pd.to_datetime(df['AppointmentDay'])
df['ScheduledDay'] = pd.to_datetime(df['ScheduledDay'])

# 计算挂号与预约日期的间隔天数
df['time_diff'] = (df['AppointmentDay'].dt.date - df['ScheduledDay'].dt.date).dt.days

# 按患者分组,统计当前预约之前的爽约次数
# shift(1)确保只取当前预约之前的记录,fillna(0)处理首次预约的情况
df['no_show_count'] = df.groupby('PatientId')['No-show'].apply(lambda x: x.eq('Yes').cumsum().shift(1).fillna(0))

# 统计当前预约之前的总预约数:cumcount()从0开始计数,正好对应既往预约数量
df['appointment_count'] = df.groupby('PatientId').cumcount()

# 计算既往爽约率,首次预约时因分母为0产生的NaN统一填充为0
df['no_show_rate'] = df['no_show_count'] / df['appointment_count']
df['no_show_rate'] = df['no_show_rate'].fillna(0)

# 打印前5行验证结果
print(df.head())

修正说明

  1. appointment_count计算修正:直接使用groupby('PatientId').cumcount(),该函数对每个患者的预约按顺序从0开始编号,编号值恰好等于当前预约之前的总预约数(首次预约编号为0,代表无既往预约)。
  2. 保留shift(1)逻辑:确保no_show_count仅累加当前预约之前的爽约记录,首次预约时shift后的值为NaN,用fillna(0)填充符合需求。
  3. NaN处理:首次预约时appointment_count为0,除法运算产生NaN,最后统一填充为0,满足首次预约爽约率为0的要求。

内容的提问来源于stack exchange,提问作者pooya ensafi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:35:33