我的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的百分比。
到目前为止,我尝试创建一个自定义聚合函数,将a
和b
两列传递给它,进行分组以得到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()
这似乎不起作用。我无法弄清楚哪里出了问题。任何帮助表示赞赏。谢谢。
答案 0 :(得分:3)
如果您的列实际上始终为0/1,并且没有其他数字,则均值应该相等。 它是在Spark中本地实现的。