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

Python Pandas DataFrame用isin实现多列医疗专科匹配的逻辑问题咨询

医疗专科三列匹配逻辑修正方案

核心问题说明

你原有的代码存在3个核心问题,导致匹配结果不符合预期:

  • isin判断逻辑不符合需求:原生Series.isin()是判断当前值是否存在于另一序列的全部值集合中,而非逐行匹配当前行另一列的内容,这是误报的核心诱因
  • 未适配Specialty_M列多值用分号分隔的场景,你的示例数据中该列存储的是多个专科的拼接值
  • 代码中存在未定义变量Exists,会直接触发运行报错

修正后实现逻辑

满足以下任一条件即标记为Correct,否则标记为Fix:

  • 三列均为空值(包括NaN和空字符串)
  • 三列值大小写不敏感完全匹配
  • 逐行校验:当前行Specialty_BE的值与Specialty_AM的值大小写不敏感相等,且Specialty_AM的值存在于当前行Specialty_M的分号分隔值列表中(大小写不敏感)

修正代码

import pandas as pd
import numpy as np

# 构造测试数据集
dfMaster = pd.DataFrame({
    'Specialty_M' : ['Telemetry', 'M/S; Clinic; ER', 'Healthcare', 'M/S; Telemetry', 'ICU', 'Clinic', 'ICU'],
    'Specialty_AM': ['ICU', 'ER', 'HLTH', 'M/S', 'ICU', 'PEDS', 'ICU'],
    'Specialty_BE' : ['ICU', 'ER', '','M/S', 'ICU', '', 'ICU']
})

# 自定义匹配函数
def check_specialty(row):
    # 兼容NaN空值场景
    if pd.isna(row['Specialty_M']) and pd.isna(row['Specialty_AM']) and pd.isna(row['Specialty_BE']):
        return True
    # 兼容空字符串空值场景
    m_val = str(row['Specialty_M']).strip()
    am_val = str(row['Specialty_AM']).strip()
    be_val = str(row['Specialty_BE']).strip()
    if m_val == '' and am_val == '' and be_val == '':
        return True
    # 三列完全匹配校验
    if m_val.upper() == am_val.upper() == be_val.upper():
        return True
    # 层级包含校验
    if be_val.upper() == am_val.upper():
        m_list = [x.strip().upper() for x in m_val.split(';')]
        if am_val.upper() in m_list:
            return True
    return False

# 生成结果列
dfMaster['SPECIALTY Okay?'] = np.where(dfMaster.apply(check_specialty, axis=1), 'Correct', 'Fix')

结果验证

运行后输出的标记结果完全匹配需求:三列均为ICU、ER层级匹配的行都会标记为Correct,不满足规则的行统一标记为Fix。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:08