Skip to main content
 首页 » 编程设计

python之在 Spark 数据框中计算分组百分比的更简单方法

2025年02月15日32mate10pro

给定以下数据框:

df = sc.parallelize([ 
    ('2017-05-21', 'a'), 
    ('2017-05-21', 'c'), 
    ('2017-05-22', 'b'), 
    ('2017-05-22', 'c'), 
    ('2017-05-23', 'a'), 
    ('2017-05-23', 'b'), 
    ('2017-05-23', 'c'), 
    ('2017-05-23', 'c'), 
]).toDF(['date', 'foo']) 

我想获取 foo == a 的每日百分比:

+----------+----------+ 
|      date|percentage| 
+----------+----------+ 
|2017-05-21|       0.5| 
|2017-05-22|       0.0| 
|2017-05-23|      0.25| 
+----------+----------+ 

这是我想出的:

df.withColumn('foo_a', df.foo == 'a') 
  .groupby('date') 
  .agg((func.sum(col('foo_a').cast('integer'))/func.count('*')).alias('percentage')) 
  .sort('date') 

这行得通,但我觉得应该有更简单的方法。具体来说,有没有统计某个值出现次数的聚合函数?

请您参考如下方法:

mean/avg 结合when:

from pyspark.sql.functions import avg, col, when 
 
df.groupBy("date").agg(avg(when(col("foo") == "a", 1).otherwise(0))) 

或转换:

df.groupBy("date").agg(avg((col("foo") == "a").cast("integer"))) 

就是你所需要的。