You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas合并DataFrame,匹配TestA时间前最近的TestB数据?

解决Pandas中按患者匹配最近早于目标时间的检测数据问题

需求:将存储TestA数据的df1和存储TestB数据的df2合并,为每条TestA记录匹配同一患者、**时间早于且最接近Time(A)**的TestB值。

步骤实现

  1. 转换时间列类型
    首先需要将字符串格式的时间列转为Pandas的datetime类型,否则无法进行时间比较:

    import pandas as pd
    
    # 转换时间列
    df1['Time(A)'] = pd.to_datetime(df1['Time(A)'])
    df2['Time(B)'] = pd.to_datetime(df2['Time(B)'])
    
  2. 排序DataFrame
    merge_asof要求左右表都按匹配键和时间键排序,所以先对两个表按Patient和时间列排序:

    df1_sorted = df1.sort_values(['Patient', 'Time(A)'])
    df2_sorted = df2.sort_values(['Patient', 'Time(B)'])
    
  3. 按患者匹配最近早于目标时间的记录
    使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:40:22