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

PySpark DataFrame按年份区间分组统计电影平均评分问题

PySpark按指定年份区间分组统计电影平均评分

核心思路

通过PySpark的条件判断函数生成年份区间字段,再按该字段分组计算平均评分,同时保留无上映年份的分组。

实现代码

首先导入PySpark SQL函数:

from pyspark.sql import functions as F

假设df是已加载的电影数据集DataFrame,执行以下操作:

# 生成年份区间字段
df_with_range = df.withColumn(
    "year_range",
    F.when(F.col("relYear").isNull(), "无上映年份")
    .when(F.col("relYear") >= 2000, "2000年及以后")
    .when(F.col("relYear").between(1990, 1999), "1990-1999")
    .when(F.col("relYear").between(1980, 1989), "1980-1989")
    .when(F.col("relYear").between(1970, 1979), "1970-1979")
    .when(F.col("relYear").between(1960, 1969), "1960-1969")
    .otherwise("1959年及更早")
)

# 分组计算平均评分并按逻辑顺序排序
result = df_with_range.groupBy("year_range") \
    .agg(F.round(F.avg("rating"), 2).alias("average_rating")) \
    .orderBy(
        F.when(F.col("year_range") == "无上映年份", 0)
        .when(F.col("year_range") == "1959年及更早", 1)
        .when(F.col("year_range") == "1960-1969", 2)
        .when(F.col("year_range") == "1970-1979", 3)
        .when(F.col("year_range") == "1980-1989", 4)
        .when(F.col("year_range") == "1990-1999", 5)
        .when(F.col("year_range") == "2000年及以后", 6)
    )

# 输出结果
result.show()

关键说明

  • 优先判断relYear为空的情况,确保"无上映年份"分组被正确识别
  • otherwise直接覆盖1874-1959的所有年份,无需额外区间判断
  • 用F.round对平均评分保留两位小数,结果更易读
  • 自定义排序规则,避免字符串排序导致的区间顺序混乱

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:21:35