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
相关产品推荐
相关产品推荐

