猿问

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

我有一个来自 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.NaN

for 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 因为我不知道如何仅过滤之前发生的日期


然后会有一栏显示患者已预约但在当前预约之前未出现的次数。


喵喵时光机
浏览 87回答 1
1回答

慕虎7371278

我认为您可以使用 pandas apply函数,它允许您在数据帧的每一行(或列)上运行任意函数。例如:def count_missed_apts_before_now(row, df):&nbsp; &nbsp; subdf = df.query("AppointmentDay<@row.ScheduledDay and `No-show`=='Yes' and PatientId==@row.PatientId")&nbsp; &nbsp; return len(subdf)&nbsp; &nbsp;&nbsp;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 在同一天具有较晚的时间戳。
随时随地看视频慕课网APP

相关分类

Python
我要回答