如何通过for循环跨多列创建Pandas新列?ICD编码匹配场景
搞定ICD编码匹配需求的两种方法
我来帮你完善这个函数,实现逐行扫描DXCODE1到DXCODE25、判断是否匹配目标ICD编码的功能~下面给你两种实用的实现方式,按需选择:
方式一:自定义逐行处理函数
如果需要手动控制逐行逻辑,这个函数可以直接用:
def scan_icd(row): # 用集合存储目标编码,查找效率更高 target_icds = {'F32', 'F33', 'F34'} # 遍历DXCODE1到DXCODE25 for i in range(1, 26): dx_code = row.get(f'DXCODE{i}') # 跳过空值,避免报错 if dx_code is None: continue # 检查当前编码是否包含目标ICD的任意一个 for icd in target_icds: if icd in str(dx_code): return 1 # 遍历完所有编码都没匹配,返回0 return 0
关键细节说明:
- 把目标编码存在集合里:集合的成员查找速度比列表快,数据量大的时候差异会很明显。
- 用
row.get()获取值:避免遇到不存在的列名时直接报错,更健壮。 - 转字符串处理:确保即使DXCODE是数字类型(比如有些系统会存成编码对应的数字),也能正常检查包含关系。
- 提前返回:一旦找到匹配的编码立刻返回1,不用继续遍历剩下的变量,节省时间。
方式二:Pandas向量化操作(更高效)
如果你的数据是存在Pandas DataFrame里的,强烈推荐用这种方式,比逐行apply快得多:
import pandas as pd # 假设你的数据集是df target_icds = ['F32', 'F33', 'F34'] # 先把所有DXCODE列名整理成列表 dx_columns = [f'DXCODE{i}' for i in range(1, 26)] # 生成新列,标记是否匹配目标ICD df['has_target_icd'] = df[dx_columns].apply( lambda row: any(icd in str(val) for val in row if pd.notna(val)), axis=1 ).astype(int)
为什么推荐这种?
- 向量化操作是Pandas的优势,处理大规模数据时,速度比逐行循环快几倍甚至几十倍。
any()函数会自动在找到第一个匹配项时停止检查,同样高效。pd.notna(val)用来跳过空值,避免空值干扰判断。
额外提示
如果你的需求是精确匹配(比如必须完全等于'F32',而不是包含'F32'),只需要把判断条件改成str(val) in target_icds就可以啦~
内容的提问来源于stack exchange,提问作者KubiK888
相关产品推荐
相关产品推荐

