亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以矢量化形式(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 [email protected]")

    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 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號