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
相关产品推荐
相关产品推荐

