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

