如何用Pandas合并DataFrame,匹配TestA时间前最近的TestB数据?
解决Pandas中按患者匹配最近早于目标时间的检测数据问题
需求:将存储TestA数据的df1和存储TestB数据的df2合并,为每条TestA记录匹配同一患者、**时间早于且最接近Time(A)**的TestB值。
步骤实现
转换时间列类型
首先需要将字符串格式的时间列转为Pandas的datetime类型,否则无法进行时间比较:import pandas as pd # 转换时间列 df1['Time(A)'] = pd.to_datetime(df1['Time(A)']) df2['Time(B)'] = pd.to_datetime(df2['Time(B)'])排序DataFrame
merge_asof要求左右表都按匹配键和时间键排序,所以先对两个表按Patient和时间列排序:df1_sorted = df1.sort_values(['Patient', 'Time(A)']) df2_sorted = df2.sort_values(['Patient', 'Time(B)'])按患者匹配最近早于目标时间的记录
使用pd.merge_asof,通过by='Patient'限定同一患者内匹配,direction='backward'指定匹配小于等于左表时间的最近记录:merged_df = pd.merge_asof( df1_sorted, df2_sorted, by='Patient', left_on='Time(A)', right_on='Time(B)', direction='backward' )
结果展示
运行后得到的合并DataFrame如下:
Patient TestA Time(A) TestB Time(B) 0 1 617.0 2019-12-07 13:21:15.224157 56.0 2019-12-07 12:31:15.224157 1 1 53.0 2019-12-07 14:21:15.224157 45.0 2019-12-07 14:21:15.224157 2 1 40.0 2019-12-07 15:21:15.224157 32.0 2019-12-07 15:21:15.224157 3 2 35.0 2019-12-07 13:21:15.224157 NaN NaT 4 2 42.0 2019-12-07 16:21:15.224157 42.0 2019-12-07 16:21:15.224157
- 患者1的13:21 TestA记录匹配到了最近的早于它的12:31 TestB值
- 若某患者的TestA记录没有早于它的TestB数据(如患者2的13:21记录),会填充NaN
可选:严格匹配早于(排除时间相等)
如果需要严格筛选时间早于Time(A)的记录,可在合并后过滤:
merged_df = merged_df[merged_df['Time(B)'] < merged_df['Time(A)']]
内容的提问来源于stack exchange,提问作者B D
相关产品推荐
相关产品推荐

