给定以下数据框:
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")))
就是你所需要的。
