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

PySpark按分组基于另一列新增列:求分组最大价格问题

PySpark按ID分组求Price列最大值(处理字符串类型与空值)

问题描述

现有如下结构的PySpark DataFrame:

id item price
1  x    2.0
1  y
2  z    1.0

需要按id分组,为每一行添加对应分组的price列最大值,得到结果:

id item price max_price
1  x    2.0   2.0
1  y          2.0
2  z    1.0   1.0

尝试使用以下代码时,因price列为字符串类型无法转换而报错:

df = df.withColumn('price', max('price').over(Window.partitionBy('id')))

解决方案

核心思路

先将字符串类型的price转换为数值类型(自动保留空值),再通过窗口函数计算分组最大值。

实现代码

方法1:分步处理(更直观)

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

# 1. 将price列转为数值类型,空值保持为null
df = df.withColumn("price_numeric", F.col("price").cast(DoubleType()))

# 2. 按id分组计算最大值,新增max_price列
window = Window.partitionBy("id")
df = df.withColumn("max_price", F.max("price_numeric").over(window))\
       .drop("price_numeric")  # 删除临时列

方法2:一步完成(简化写法)

无需创建临时列,直接在窗口函数中完成类型转换:

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

window = Window.partitionBy("id")
df = df.withColumn(
    "max_price",
    F.max(F.col("price").cast("double")).over(window)
)

说明

  • cast("double")或cast(DoubleType())都能将字符串类型的数值转为双精度浮点数,空值会被保留为null,max函数会自动忽略空值,不影响最大值计算。
  • 最终结果保留原始price列的内容,新增的max_price列对应分组内非空price的最大值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:42:08