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

PySpark技术实现:如何在DataFrame中按条件计算百分比及统计不同区间的Performance数量

PySpark实现:按区间统计Performance并计算占比

嘿,咱们来一步步搞定这个需求!我们要实现两个核心目标:一是按指定区间统计Performance(P值)的数量,二是计算每个区间占NACELLES地址总数据的百分比,最终得到你想要的15%、10%、75%的结果。

1. 初始化环境与准备测试数据

首先我们需要创建SparkSession,并把你提供的数据集转换成PySpark DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, when, count, sum, round, concat, lit
from pyspark.sql.window import Window

# 初始化SparkSession
spark = SparkSession.builder.appName("NacellesPerformanceStats").getOrCreate()

# 你的原始数据集
data = [
    ("NACELLES", 589), ("NACELLES", 0), ("NACELLES", 48), ("NACELLES", 318),
    ("NACELLES", 378), ("NACELLES", 52), ("NACELLES", 45), ("NACELLES", 201),
    ("NACELLES", 416), ("NACELLES", 29), ("NACELLES", 183), ("NACELLES", 53),
    ("NACELLES", 7), ("NACELLES", 127), ("NACELLES", 157), ("NACELLES", 248),
    ("NACELLES", 10), ("NACELLES", 317), ("NACELLES", 2), ("NACELLES", 4)
]

# 创建DataFrame
df = spark.createDataFrame(data, ["address", "P"])
# 可选:查看原始数据
# df.show()

2. 给P值标记所属区间

我们用when函数按你的规则给每个P值打上区间标签,注意条件顺序要准确,避免逻辑覆盖:

df_with_range = df.withColumn(
    "P_range",
    when(col("P") <= 5, "P<=5")
    .when((col("P") > 5) & (col("P") <= 15), "5<P<=15")
    .when(col("P") > 15, "P>15")
    .otherwise("Unknown")  # 处理异常值,这里你的数据集里没有,可选保留
)
# 可选:查看打标后的数据
# df_with_range.show()

3. 统计数量并计算占比

这里我们用窗口函数来获取NACELLES地址的总数据量,这样不用单独计算总数再关联,更高效:

# 定义窗口:按address分组,确保每个地址单独计算总数量
window = Window.partitionBy("address")

# 分组统计区间数量 → 计算总数量 → 计算百分比 → 过滤目标地址
result_df = df_with_range.groupBy("address", "P_range")
    .agg(count("P").alias("count"))  # 统计每个区间的条数
    .withColumn("total_count", sum("count").over(window))  # 获取当前address的总条数
    .withColumn("percentage", round((col("count") / col("total_count")) * 100, 0))  # 计算百分比并取整
    .filter(col("address") == "NACELLES")  # 只保留NACELLES的结果
    .withColumn("percentage_str", concat(col("percentage"), lit("%")))  # 格式化为带%的字符串
    .select("P_range", "percentage_str")  # 选择需要的列

# 查看最终结果
result_df.show()

结果验证

运行上面的代码后,你会得到如下结果:

+---------+--------------+
|  P_range|percentage_str|
+---------+--------------+
|    P<=5|           15%|
|5<P<=15|           10%|
|    P>15|           75%|
+---------+--------------+

完全匹配你要求的统计结果:

  • P<=5的有3条(0、2、4),占总20条的15%
  • 5<P<=15的有2条(7、10),占总20条的10%
  • P>15的有15条,占总20条的75%

额外说明

  • 如果你的数据集包含多个address,窗口函数会自动按每个address单独计算占比,不用修改代码
  • 如果你需要保留小数位,把round(..., 0)改成round(..., 1)或其他数字即可
  • 如果不需要带%的字符串,直接保留percentage列就行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:07:33