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

如何在PySpark中使用AND运算符更新DataFrame并保留多条件结果

解决方案:保留两段条件的匹配结果

你的问题出在第二段代码的otherwise('')会覆盖掉第一段已经设置的senior值——当行已经满足第一段条件(department为senior)时,第二段的条件不触发,会执行otherwise('')把senior清空,最终只剩第二段的结果。

要同时保留两段的匹配结果,且不满足条件的字段设为null,可以用以下两种方式:

方式一:合并条件为一次链式判断

直接通过连续的when语句按优先级判断,一次完成列更新,逻辑更清晰:

from pyspark.sql import functions as F

# 先判断更早的日期条件,匹配则设为senior;不匹配再判断第二个日期条件,匹配设为junior;其余设为null
df1 = df1.withColumn(
    'department',
    F.when(F.col('dateofjoining') < '2019-09-01', 'senior')
     .when(F.col('dateofjoining') < '2019-12-15', 'junior')
     .otherwise(None)
)

方式二:分两次更新但保留原有值

如果必须分两次执行,需要修改第二段代码的otherwise逻辑,保留已经设置好的department值,而非设为空字符串:

from pyspark.sql import functions as F

# 第一段:满足日期条件设为senior,其余设为null(而非空字符串)
df1 = df1.withColumn('department', F.when(F.col('dateofjoining') < '2019-09-01', 'senior').otherwise(None))

# 第二段:仅当department为null且满足第二个日期条件时设为junior,否则保留原有值
df1 = df1.withColumn(
    'department',
    F.when(F.col('department').isNull() & (F.col('dateofjoining') < '2019-12-15'), 'junior')
     .otherwise(F.col('department'))
)

关键说明

  • 方式一中,when是按顺序匹配的,先匹配的条件会优先生效,所以要把更严格的日期条件(更早的日期)放在前面。
  • 方式二中,第一段把不满足条件的设为null而非空字符串,是为了和第二段的判断逻辑更清晰区分,避免空字符串和null的混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:11:17