在Databricks中用PySpark的.isin分类数据时全标记UNKNOWN的问题
PySpark中edu_level标记错误的问题解决
错误原因
你的代码用isin()判断整个edu_hist字符串是否完全等于列表中的单个值,但edu_hist是逗号分隔的多字符组合(比如, , T, 3, 6),和单个字符完全不匹配,导致所有条件都不触发,最终返回UNKNOWN。
你的需求是:只要edu_hist中包含某组的任意字符,就标记对应教育等级,且按when的顺序优先匹配(比如id123的edu_hist包含T、3、6,优先匹配COLLEGE DEGREE)。
解决方案
需要检查edu_hist中是否包含目标组的任意字符,而不是完全匹配。以下两种方法都可以实现:
方法1:正则匹配(rlike)
用正则表达式精准匹配单个字符,避免误判:
import pyspark.sql.functions as F df = df.withColumn('edu_level', # 匹配GRADUATE DEGREE对应的字符 F.when(F.col('edu_hist').rlike(r'(^|, )(7|8|9|Z)(, |$)'), 'GRADUATE DEGREE') # 匹配COLLEGE DEGREE对应的字符 .when(F.col('edu_hist').rlike(r'(^|, )(5|6|W|X|Y)(, |$)'), 'COLLEGE DEGREE') # 匹配SOME COLLEGE对应的字符 .when(F.col('edu_hist').rlike(r'(^|, )(3|4|V)(, |$)'), 'SOME COLLEGE') # 匹配HIGH SCHOOL OR EQUIVALENT对应的字符 .when(F.col('edu_hist').rlike(r'(^|, )(S|T|U)(, |$)'), 'HIGH SCHOOL OR EQUIVALENT') # 匹配OTHER对应的字符 .when(F.col('edu_hist').rlike(r'(^|, )(0|1|2|N|O|P|Q|R)(, |$)'), 'OTHER') .otherwise('UNKNOWN') )
正则说明:(^|, )匹配字符串开头或逗号加空格,(字符组)匹配目标字符,(, |$)匹配逗号加空格或字符串结尾,确保只匹配独立的单个字符。
方法2:拆分数组+交集判断
先把edu_hist拆分成数组,再判断和目标组的交集:
import pyspark.sql.functions as F # 拆分edu_hist为数组,过滤掉空字符串 split_edu_col = F.array_remove(F.split(F.col('edu_hist'), ', '), '') df = df.withColumn('edu_level', F.when(F.size(F.array_intersect(split_edu_col, F.array('7','8','9','Z'))) > 0, 'GRADUATE DEGREE') .when(F.size(F.array_intersect(split_edu_col, F.array('5','6','W','X','Y'))) > 0, 'COLLEGE DEGREE') .when(F.size(F.array_intersect(split_edu_col, F.array('3','4','V'))) > 0, 'SOME COLLEGE') .when(F.size(F.array_intersect(split_edu_col, F.array('S','T','U'))) > 0, 'HIGH SCHOOL OR EQUIVALENT') .when(F.size(F.array_intersect(split_edu_col, F.array('0','1','2','N','O','P','Q','R'))) > 0, 'OTHER') .otherwise('UNKNOWN') )
逻辑说明:拆分后过滤空值,再用array_intersect判断和目标数组是否有重叠元素,有则触发对应条件。
两种方法都能得到你预期的输出结果:
| id | edu_hist | edu_level |
|---|---|---|
| 123 | , , T, 3, 6 | COLLEGE DEGREE |
| 456 | , 7, X, 4, , | GRADUATE DEGREE |
| 789 | , 3, S, 2, , | SOME COLLEGE |
内容的提问来源于stack exchange,提问作者carousallie
相关产品推荐
相关产品推荐

