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

如何在PySpark中根据多列条件生成漏斗步骤列?

PySpark 实现转化漏斗步骤列(基于最后一个非空日期列)

需求说明

根据date_lead→date_login→date_access→date_buy→date_del的顺序,取每行中最后一个非空日期列对应的步骤名称,生成step列。


方法一:嵌套WHEN逻辑(对应Pandas覆盖式赋值)

和Pandas中从前往后覆盖的逻辑对应,这里反向从最后一个步骤开始判断,优先匹配后续非空列:

from pyspark.sql import functions as F

# 新增step列
df = df.withColumn(
    "step",
    F.when(F.col("date_del").isNotNull(), "del")
    .when(F.col("date_buy").isNotNull(), "buy")
    .when(F.col("date_access").isNotNull(), "access")
    .when(F.col("date_login").isNotNull(), "login")
    .when(F.col("date_lead").isNotNull(), "lead")
    .otherwise(None)  # 处理所有日期列都为空的情况
)

方法二:数组+内置函数(灵活适配多列场景)

通过构造日期列与步骤名的映射数组,过滤空值后取最后一个有效步骤,适合列数量较多的场景:

from pyspark.sql import functions as F

# 定义日期列和对应步骤的映射关系
date_step_mapping = [
    ("date_lead", "lead"),
    ("date_login", "login"),
    ("date_access", "access"),
    ("date_buy", "buy"),
    ("date_del", "del")
]

# 构造数组并处理空值,提取最后一个有效步骤
df = df.withColumn(
    "step",
    F.element_at(
        F.filter(
            F.array(*[F.struct(F.col(date_col).alias("dt"), F.lit(step).alias("step_name")) 
                      for date_col, step in date_step_mapping]),
            lambda x: x.dt.isNotNull()
        ),
        -1  # 取数组最后一个元素
    ).step_name
)

两种方法执行后,都能得到预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:14:37