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

如何用Pandas查找患者就诊预约前后的最近检测结果?

解决思路与代码实现

数据预处理:先排序

首先把合并后的DataFrame按患者+日期升序排列,这是后续匹配最近日期的基础:

df_sorted = df.sort_values(['patient', 'date']).reset_index(drop=True)

方法一:分组填充法(适合小数据集)

利用分组后的向前/向后填充,给每个预约日期匹配前后最近的检测值和日期:

# 提取仅检测记录有值的临时列
df_sorted['test_val'] = df_sorted['value'].where(df_sorted['event'] == '检测')
df_sorted['test_dt'] = df_sorted['date'].where(df_sorted['event'] == '检测')

# 分组后向前填充,得到预约日期前最近的检测数据
df_sorted['last_test_val'] = df_sorted.groupby('patient')['test_val'].ffill()
df_sorted['last_test_dt'] = df_sorted.groupby('patient')['test_dt'].ffill()

# 分组后向后填充,得到预约日期后最近的检测数据
df_sorted['next_test_val'] = df_sorted.groupby('patient')['test_val'].bfill()
df_sorted['next_test_dt'] = df_sorted.groupby('patient')['test_dt'].bfill()

# 筛选出所有预约记录,就是最终结果
final_df = df_sorted[df_sorted['event'] == '预约'].drop(columns=['test_val', 'test_dt'])

方法二:merge_asof法(高效适合大数据集)

Pandas的merge_asof是专门用于按日期匹配最近邻记录的工具,速度更快:

1. 拆分数据集

先把预约和检测数据拆成两个单独的DataFrame:

appt_df = df[df['event'] == '预约'][['patient', 'date']].rename(columns={'date': 'appt_date'})
test_df = df[df['event'] == '检测'][['patient', 'date', 'value']].rename(columns={'date': 'test_date', 'value': 'test_val'})

2. 匹配预约前最近的检测

last_test_match = pd.merge_asof(
    appt_df.sort_values('appt_date'),
    test_df.sort_values('test_date'),
    by='patient',
    left_on='appt_date',
    right_on='test_date',
    direction='backward'  # 找小于等于预约日期的最近检测
)

3. 匹配预约后最近的检测

next_test_match = pd.merge_asof(
    appt_df.sort_values('appt_date'),
    test_df.sort_values('test_date'),
    by='patient',
    left_on='appt_date',
    right_on='test_date',
    direction='forward'  # 找大于等于预约日期的最近检测
)

4. 合并结果

把前后匹配的结果合并到一起:

final_result = pd.merge(
    last_test_match,
    next_test_match[['patient', 'appt_date', 'test_date', 'test_val']],
    on=['patient', 'appt_date'],
    suffixes=('_last', '_next')
)

关键注意点

  • 确保date字段是datetime类型,否则排序和匹配会出错,提前用df['date'] = pd.to_datetime(df['date'])转换
  • 如果预约日期前后没有检测记录,对应字段会出现NaN,可根据业务需求做填充或过滤

内容的提问来源于stack exchange,提问作者Xiaoming Zeng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:15:41