计算PySpark中Spark DataFrame的多个列值的百分比

时间:2019-10-24 17:53:21

标签: python apache-spark pyspark

我的Spark DataFrame中有多个二进制列(0和1)。我想计算每列中1的百分比,并将结果投影到另一个DataFrame中。

输入DataFrame dF如下:

+------------+-----------+
|           a|          b|
+------------+-----------+
|           0|          1|
|           1|          1|
|           0|          0|
|           1|          1|
|           0|          1|
+------------+-----------+

预期输出如下:

+------------+-----------+
|           a|          b|
+------------+-----------+
|          40|         80|
+------------+-----------+

40(2/5)和80(4/5)分别是a和b列中1的百分比。

到目前为止,我尝试创建一个自定义聚合函数,将ab两列传递给它,进行分组以得到0和1的计数,并计算0和1,最后过滤DataFrame以仅保留1。

selection =  ['a', 'b']

@F.udf
def cal_perc(c, dF):
    grouped = dF.groupBy(c).count()
    grouped = grouped.withColumn('perc_' + str(c), ((grouped['count']/5) * 100))
    return grouped[grouped[c] == 1].select(['perc_' + str(c)])

dF.select(*(dF[c].alias(c) for c in selection)).agg(*(cal_perc(c, dF).alias(c) for c in selection)).show()

这似乎不起作用。我无法弄清楚哪里出了问题。任何帮助表示赞赏。谢谢。

1 个答案:

答案 0 :(得分:3)

如果您的列实际上始终为0/1,并且没有其他数字,则均值应该相等。 它是在Spark中本地实现的。