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)
但由于尺寸太大,运行时间很长。我可以知道有什么更聪明的方法可以做到这一点吗?非常感谢你。
这是一个完美的用例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 |
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |