DataFrame中基于相似诊断匹配GP转SP随访标记的问题求解
解决CSV数据集新增gp_to_sp列的部分匹配问题
问题分析
- 需求:同一
ID Number下,当某行Panel为SP,且存在同ID的GP行,且两者Diagnosis完全/部分匹配时,gp_to_sp标记为True - 现有问题:
- CODE1仅支持完全匹配,漏掉部分匹配的记录(如ID 1002的Visit ID7)
- CODE2使用
str.contains()时传入Series,触发unhashable type: Series错误(原因:str.contains()要求pattern为单个字符串,而非列表/Series)
可行解决方案
方案一:分组逐行匹配(推荐)
通过groupby按患者ID分组,对每个组内的SP记录检查是否存在匹配的GP诊断:
import pandas as pd def process_group(group): # 收集当前患者所有GP门诊的诊断 gp_diags = group[group['Panel'] == 'GP']['Diagnosis'].tolist() if not gp_diags: group['gp_to_sp'] = False return group def check_match(row): if row['Panel'] != 'SP': return False # 检查当前SP诊断与任意GP诊断是否存在包含关系(完全/部分匹配) return any(gp_diag in row['Diagnosis'] or row['Diagnosis'] in gp_diag for gp_diag in gp_diags) group['gp_to_sp'] = group.apply(check_match, axis=1) return group # 应用到数据集 df = df.groupby('ID Number').apply(process_group).reset_index(drop=True)
方案二:合并子集后匹配
将GP和SP记录分别提取并合并,逐行检查匹配后再合并回原数据集:
# 提取GP和SP子集 gp_subset = df[df['Panel'] == 'GP'][['ID Number', 'Diagnosis']].rename(columns={'Diagnosis': 'GP_Diagnosis'}) sp_subset = df[df['Panel'] == 'SP'].copy() # 合并同ID的GP与SP记录 merged_sp = pd.merge(sp_subset, gp_subset, on='ID Number', how='left') # 判断诊断匹配情况 merged_sp['gp_to_sp'] = merged_sp.apply( lambda x: x['Diagnosis'] in x['GP_Diagnosis'] or x['GP_Diagnosis'] in x['Diagnosis'], axis=1 ) # 合并结果回原数据集,非SP行填充False df = df.merge(merged_sp[['ID Number', 'Visit ID', 'gp_to_sp']], on=['ID Number', 'Visit ID'], how='left') df['gp_to_sp'] = df['gp_to_sp'].fillna(False)
关键说明
- 两种方案均通过包含关系判断实现完全/部分匹配,解决CODE1的局限性
- 避免直接将Series传入
str.contains(),改用逐行遍历或any()结合子串判断,解决CODE2的报错问题
内容的提问来源于stack exchange,提问作者Frederik Wolter
相关产品推荐
相关产品推荐

