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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:15:34