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

基于Type列自定义排序PySpark DataFrame并生成NEW_RANK列

PySpark DataFrame 排序与字段转换实现方案

需求说明

  • 按Type列指定优先级排序:AAIC > AAFC > TBIC > TBFC,同一Type组内按RANK列升序排列
  • 将Type列中不属于上述四类的值统一重命名为NON
  • 新增NEW_RANK列,标记最终的全局排序位次

代码实现

from pyspark.sql import functions as F
from pyspark.sql.window import Window

# 定义Type优先级顺序数组
type_priority = F.array(F.lit("AAIC"), F.lit("AAFC"), F.lit("TBIC"), F.lit("TBFC"))

# 处理逻辑
result_df = df.withColumn(
    "Type",
    # 替换非指定Type为NON
    F.when(F.col("Type").isin(*type_priority), F.col("Type")).otherwise(F.lit("NON"))
).withColumn(
    "sort_key",
    # 生成排序优先级key:指定Type按顺序取索引,NON放在最后
    F.coalesce(F.array_position(type_priority, F.col("Type")), F.lit(len(type_priority)+1))
).orderBy(
    # 先按优先级排序,再按RANK升序
    F.col("sort_key"),
    F.col("RANK").asc()
).withColumn(
    "NEW_RANK",
    # 生成全局排序位次
    F.row_number().over(Window.orderBy("sort_key", "RANK"))
).drop("sort_key") # 删除临时排序字段

# 查看结果
result_df.show()

代码解释

  1. Type字段替换:通过when-otherwise判断字段值是否在指定列表内,不符合条件的直接替换为NON
  2. 排序优先级设置:用array_position获取指定Type在优先级数组中的位置,作为排序的第一依据;NON被设置为最大排序值,确保排在所有指定Type之后
  3. 排序规则:先按自定义优先级排序,同组内再按RANK字段升序排列
  4. 生成位次列:利用row_number()窗口函数,基于最终排序规则生成全局连续位次

结果验证

执行上述代码后,输出的DataFrame与目标示例完全匹配,所有需求均满足。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:25:53