循环数据帧的更快方法?

Isa*_*Tai 3 python for-loop pandas

我非常渴望寻求帮助。我有两个数据框,

df1 是患者的入院记录。

病人钥匙 录取_dtm 入场密钥
P001 41765 P001-001
P001 42223 P001-002
P001 42681 P001-003
P001 43139 P001-004
P001 43597 P001-005
P001 44055 P001-006

df2为患者的门诊预约记录

病人钥匙 约会_dtm
P001 41645
P001 41687
P001 41717
P001 42162
P001 42193
P001 42497

我想做的是在每次入院前找到门诊预约。例如,P001-001入院前,P001患者有3次门诊预约。

df2 中的预期结果如下:

病人钥匙 约会_dtm 入场密钥
P001 41645 P001-001
P001 41687 P001-001
P001 41717 P001-001
P001 42162 P001-002
P001 42193 P001-002
P001 42497 P001-003

我用过这样一个非常愚蠢的方法

df2['admission_key'] = ''
for i in df2.index:
    for j in df1.index:
        if df2.['patient_key'].iloc[i] == df1['patient_key'].iloc[i] and 
           df2.['appointment_dtm'].iloc[i] > df1['admission_dtm'].iloc[i] and
           df2.['appointment_dtm'].iloc[i] < df1['admission_dtm'].iloc[i].shift(-1):
           df2['admission_key'] = df1['admission_key']
Run Code Online (Sandbox Code Playgroud)

但由于尺寸太大,运行时间很长。我可以知道有什么更聪明的方法可以做到这一点吗?非常感谢你。

Pet*_*ler 5

这是一个完美的用例merge_asof

pd.merge_asof(df2, df1, 
              by='patient_key', 
              left_on='appointment_dtm',
              right_on='admission_dtm',
              direction='forward').drop(columns='admission_dtm')
Run Code Online (Sandbox Code Playgroud)

结果:

病人钥匙 约会_dtm 入场密钥
P001 41645 P001-001
P001 41687 P001-001
P001 41717 P001-001
P001 42162 P001-002
P001 42193 P001-002
P001 42497 P001-003