PySpark基于when条件替换DataFrame列值的问题求助
问题分析与解决方案
问题根源
你的代码存在三个核心问题:
- 重复且冗余的
when条件:两个when使用完全相同的判断逻辑,第一个条件满足后第二个不会触发,逻辑设计错误。 - 错误的列引用方式:
regexp_replace的第一个参数传入了字符串'country_code_iso3',而非列对象,导致实际是对字符串字面量进行替换操作,而非DataFrame列的值。 - 不必要的
regexp_replace使用:针对null值,regexp_replace无法生效;且你的需求本质是直接覆盖值,而非正则替换,用regexp_replace完全多余。
正确代码实现
你的核心需求是:只要country_code以UA-开头,就将country_code_iso3设置为UKR,不管原有值是null还是UA。直接赋值即可实现,无需正则替换:
from pyspark.sql.functions import when, col df = df.withColumn('country_code_iso3', when(col('country_code').startswith('UA-'), 'UKR') .otherwise(col('country_code_iso3')) )
代码解释
- 使用
col('country_code')明确引用DataFrame列(也可使用df.country_code)。 - 当
country_code满足UA-开头的条件时,直接赋值字符串'UKR',完美覆盖null和UA两种情况。 - 不满足条件时,保留原列的原始值。
执行后即可得到你期望的结果:
|country_code|country_code_iso3| | UA-09| UKR| | UA-14| UKR| | UA-43| UKR|
内容的提问来源于stack exchange,提问作者dnf999
相关产品推荐
相关产品推荐

