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

Python 以矢量化形式计算一列中的日期早于另一列中的日期(加上附加条件)的行(熊猫),python,pandas,data-science,Python,Pandas,Data Science,我有一份来自kaggle的医疗预约资料。有预约的日期(ScheduledDay)和预约的日期(AppointmentDay)。还有patientId和许多患者进行了多次预约,无论他们是否出现 我想对同样的患者做一个cumcount类的事情,他们没有出现(没有出现=‘是’),但只针对预约时已经出现的没有出现的情况 这是我计算每位患者预约次数的代码,可以 df.sort_values(by='ScheduledDay', inplace=True) df['book_count'] = df.gr

我有一份来自kaggle的医疗预约资料。有预约的日期(ScheduledDay)和预约的日期(AppointmentDay)。还有patientId和许多患者进行了多次预约,无论他们是否出现

我想对同样的患者做一个cumcount类的事情,他们没有出现(没有出现=‘是’),但只针对预约时已经出现的没有出现的情况

这是我计算每位患者预约次数的代码,可以

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')
final_index=df.index.tolist()[-1]
df['miss_count']=np.NaN
对于df['ScheduledDay']中的i。iteritems():
打印(f'{final_index}--{i[0]}')
patient=df.loc[i[0],'PatientId']
计数=df.loc[
(df['AppointmentDay']
因此,在本例中,我没有使用cumcount,因为我不知道如何只过滤以前发生过的日期


然后会出现一列,记录患者预约的次数,并且在当前预约之前没有出现。

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

例如:

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,))
def count\u missed\u apts\u before\u now(行,df):

subdf=df.query(“AppointmentDay太棒了!我对它进行了测试,它占用了我方法60%的时间,并精确地复制了它。@row部分是我还没有学会的。参数args=(df,)是如何实现的工作?参数是row和df,但在调用函数时未指定row?我无法联机找到任何东西来解释如何使用
。apply()
自动传递第一个参数(
row
)(或者如果使用
axis=0
,则函数的第一个参数将是列)因此,
args
参数只需要将任何附加的位置参数传递给函数,这些参数需要作为元组传递,即
(df,)
(还解释了如何使用
**kwds
传递任何关键字args)