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

Databricks PySpark:如何用变量筛选指定范围的ICD10编码字段

PySpark批量筛选ICD10编码(X85-X99、Y0-Y99)并复用筛选逻辑

要实现批量筛选指定范围的ICD10编码,同时将筛选规则封装为可复用变量,可按以下步骤操作:

核心思路

针对ICD10编码的格式特征,拆解筛选逻辑为两部分并通过或条件组合:

  • 匹配以X开头,且后续两位数字在85-99之间的编码(覆盖X85-X99)
  • 匹配以Y开头,且后续两位数字在00-99之间的编码(覆盖Y00-Y99,即需求中的Y0-Y99)

将上述逻辑封装为变量,即可在多个DataFrame中重复调用。

代码实现

基础版(编码无小数点)

假设field1存储的是不带小数点的ICD10编码(如X85、Y12):

from pyspark.sql import functions as F

# 定义可复用的筛选条件变量
icd10_filter = (
    # 匹配X85-X99
    (F.col("field1").startswith("X") & F.substring(F.col("field1"), 2, 2).cast("int").between(85, 99))
    |
    # 匹配Y00-Y99
    (F.col("field1").startswith("Y") & F.substring(F.col("field1"), 2, 2).cast("int").between(0, 99))
)

# 在目标DataFrame中应用筛选
df_xyz = df_abc.filter(icd10_filter)

# 其他表直接复用该变量
df_another_table = df_other.filter(icd10_filter)

适配版(编码带小数点)

如果field1存储的编码包含小数点(如X85.0、Y12.3),先提取小数点前的编码部分再判断:

from pyspark.sql import functions as F

icd10_filter = (
    # 提取X开头编码的前缀部分,判断范围
    (F.split(F.col("field1"), "\\.").getItem(0).startswith("X") 
     & F.split(F.col("field1"), "\\.").getItem(0).substr(2, 2).cast("int").between(85, 99))
    |
    # 提取Y开头编码的前缀部分,判断范围
    (F.split(F.col("field1"), "\\.").getItem(0).startswith("Y") 
     & F.split(F.col("field1"), "\\.").getItem(0).substr(2, 2).cast("int").between(0, 99))
)

# 复用方式和基础版一致
df_xyz = df_abc.filter(icd10_filter)

关键说明

  • 使用substring提取编码的数字部分,转成整数后用between判断范围,避免字符串比较的误差
  • 将整个筛选逻辑赋值给变量icd10_filter,后续所有需要相同筛选规则的表直接调用即可,无需重复编写条件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:39:47