如何在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 ID | GP_to_SP | GP_referral |
|---|---|---|
| 001 | False | None |
| 004 | True | 001 |
| 002 | False | None |
| 007 | True | 002 |
内容的提问来源于stack exchange,提问作者Frederik Wolter
相关产品推荐
相关产品推荐

