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

如何在DataFrame中匹配同ID跨Panel诊断并生成转诊关联与溯源列

解决方案

1. 数据预处理:按患者ID和就诊日期排序

首先确保同患者的就诊记录按时间顺序排列,同时将就诊日期转为日期类型避免字符串排序错误:

import pandas as pd

# 预处理日期并排序
df['Visit Date'] = pd.to_datetime(df['Visit Date'])
df_sorted = df.sort_values(by=['ID Number', 'Visit Date']).reset_index(drop=True)

2. 实现诊断匹配与转诊记录追踪

针对「诊断不完全匹配但应判定为转诊」的问题,我们将诊断拆分为集合进行子集匹配;同时新增GP_referral列记录触发转诊的全科门诊ID:

def process_patient_records(group):
    # 提取当前患者的所有全科门诊记录
    gp_visits = group[group['Panel'] == 'Panel GP']
    
    def check_referral_status(row):
        # 非专科门诊直接返回False和空值
        if row['Panel'] != 'Panel SP':
            return (False, None)
        
        # 拆分当前专科诊断为去重集合
        sp_diags = set([d.strip() for d in row['Diagnosis'].split(',')])
        # 筛选当前专科就诊之前的全科记录
        prior_gp = gp_visits[gp_visits['Visit Date'] < row['Visit Date']]
        
        if prior_gp.empty:
            return (False, None)
        
        # 遍历全科记录,检查诊断是否包含当前专科诊断
        for _, gp_row in prior_gp.iterrows():
            gp_diags = set([d.strip() for d in gp_row['Diagnosis'].split(',')])
            if sp_diags.issubset(gp_diags):
                return (True, gp_row['Visit ID'])
        
        # 无匹配的全科记录
        return (False, None)
    
    # 将结果拆分到两列
    group[['GP_to_SP', 'GP_referral']] = group.apply(
        check_referral_status, axis=1, result_type='expand'
    )
    return group

# 按患者ID分组处理
final_df = df_sorted.groupby('ID Number', group_keys=False).apply(process_patient_records)

关键改进点

  • 诊断匹配逻辑:不再要求诊断完全相等,而是将诊断拆分为集合后,判断专科诊断是否是某条更早全科诊断的子集,解决了「全科多诊断、专科单诊断」的匹配问题。
  • 转诊记录追踪:为符合条件的专科门诊记录,关联最早匹配的全科门诊Visit ID;无匹配时返回None。
  • 时间顺序保证:预处理时的排序确保我们只对比当前专科就诊之前的全科记录。

测试结果

针对你的测试数据集,运行后核心结果如下:

Visit IDGP_to_SPGP_referral
001FalseNone
004True001
002FalseNone
007True002

内容的提问来源于stack exchange,提问作者Frederik Wolter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:25:23