我有超过 50 万人的名单。数据看起来像第一个表。我想使用第一个表中的入院日期,如果第二个表中同一个人的入院日期在第一个表中的入院日期的 30 天内,那么我想将该重叠记录存储在第三个表。我想要的示例如下。有没有比使用 iterrows 使用第一个表中的 person_ids 和日期并检查第二个表中的每一行更快的方法?
Table 1
| person_id | admission_date | value |
| 1234 | 2017-01-31 | 6 |
| 5678 | 2018-03-20 | 12 |
| 9101 | 2017-02-22 | 11 |
| 1234 | 2020-10-31 | 19 |
| 5678 | 2019-06-16 | 21 |
| 9101 | 2021-12-14 | 8 |
Table 2
| person_id | admission_date | value |
| 1234 | 2015-01-31 | 10 |
| 1234 | 2017-02-12 | 152 |
| 5678 | 2017-01-31 | 10 |
| 5678 | 2018-04-10 | 10 |
| 9101 | 2017-02-25 | 99 |
| 9101 | 2017-03-01 | 10 |
| 1234 | 2012-12-31 | 10 |
| 5678 | 2019-07-10 | 11 |
| 9101 | 2017-01-31 | 10 |
Table 3
| person_id | admission_date | value |
| 1234 | 2017-02-12 | 152 |
| 5678 | 2018-04-10 | 10 |
| 9101 | 2017-02-25 | 99 |
| 9101 | 2017-03-01 | 10 |
| 5678 | 2019-07-10 | 11 |
最佳答案
您需要使用merge_asof
:
df1['admission_date'] = pd.to_datetime(df1['admission_date'])
df2['admission_date'] = pd.to_datetime(df2['admission_date'])
out = (pd
.merge_asof(df1.sort_values(by='admission_date')
.rename(columns={'admission_date': 'date'})
.drop(columns='value'),
df2.sort_values(by='admission_date'),
by='person_id',
left_on='date',
right_on='admission_date',
direction='forward',
tolerance=pd.Timedelta('30D')
)
.drop(columns='date')
.dropna(subset='value')
)
输出:
person_id admission_date value
0 1234 2017-02-12 152.0
1 9101 2017-02-25 99.0
2 5678 2018-04-10 10.0
3 5678 2019-07-10 11.0
关于python - Pandas 根据第一个数据帧中的重叠日期选择第二个数据帧中的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73634847/