如何基于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())
修正说明
appointment_count计算修正:直接使用groupby('PatientId').cumcount(),该函数对每个患者的预约按顺序从0开始编号,编号值恰好等于当前预约之前的总预约数(首次预约编号为0,代表无既往预约)。- 保留
shift(1)逻辑:确保no_show_count仅累加当前预约之前的爽约记录,首次预约时shift后的值为NaN,用fillna(0)填充符合需求。 - NaN处理:首次预约时
appointment_count为0,除法运算产生NaN,最后统一填充为0,满足首次预约爽约率为0的要求。
内容的提问来源于stack exchange,提问作者pooya ensafi
相关产品推荐
相关产品推荐

