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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:32:51