为了账号安全,请及时绑定邮箱和手机立即绑定

以矢量化形式(pandas)计算一列中的日期早于另一列中的日期(加上附加条件)的行

以矢量化形式(pandas)计算一列中的日期早于另一列中的日期(加上附加条件)的行

喵喵时光机 2023-12-09 15:46:43
我有一个来自 Kaggle 的数据集,其中包含医疗预约数据。有一个预约日期 (ScheduledDay) 和一个预约日期 (AppointmentDay)。还有患者ID,许多患者进行了多次预约以及是否出现。我想对相同的患者和他们没有出现的地方(缺席==“是”)进行累积计数之类的事情,但仅限于在预约时已经发生的缺席。这是我的代码,用于计算每个患者的预订数量,没问题df.sort_values(by='ScheduledDay', inplace=True)df['book_count'] = df.groupby('PatientId').cumcount()但对于我的问题,我不知道如何让它变得如此整洁。我已经完成了,但它没有矢量化,需要循环遍历行。不用说这需要很长时间final_index = df.index.tolist()[-1]df['miss_count'] = np.NaNfor i in df['ScheduledDay'].iteritems():    print(f'{final_index} -- {i[0]}')    patient = df.loc[i[0], 'PatientId']    count = df.loc[        (df['AppointmentDay'] < i[1])        & (df['No-show'] == 'Yes')        & (df['PatientId'] == patient)].shape[0]    df.loc[i[0], 'miss_count']  = count    print(f'\n{count}\n')所以在这种情况下我没有使用 cumcount 因为我不知道如何仅过滤之前发生的日期然后会有一栏显示患者已预约但在当前预约之前未出现的次数。
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

我认为您可以使用 pandas apply函数,它允许您在数据帧的每一行(或列)上运行任意函数。


例如:


def count_missed_apts_before_now(row, df):

    subdf = df.query("AppointmentDay<@row.ScheduledDay and `No-show`=='Yes' and PatientId==@row.PatientId")

    return len(subdf)

    

missed_apt_counts = df.apply(count_missed_apts_before_now, axis=1, args = (df,))

在这里,我定义了一个函数count_missed_apts_before_now(),该函数将单行和完整数据帧作为输入。它用于df.query为当前患者制作一个较小的 df,仅包含不显示行,其中 AppointmentDay 早于当前 ScheduledDay 值(“当前”是指 apply 函数正在处理的行的值)。然后我们可以计算向下选择的数据帧的长度并返回它。该apply方法对每一行执行此操作,并将结果组合成一个系列。


注意:apply不一定很快,尽管您可以使用%%timeit魔法将其与 for 循环进行比较。


另外,检查是否需要将 ScheduledDay 时间戳转换为纯日期,因为所有 AppointmentDay 值似乎都只是日期(即全部在 00:00 点),并且在某些情况下,ScheduledDay 在同一天具有较晚的时间戳。


查看完整回答
反对 回复 2023-12-09
  • 1 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信