У меня есть несколько двоичных столбцов (0 и 1) в моем Spark DataFrame. Я хочу рассчитать процент от 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) это процент от 1 в столбцах a и b соответственно.
То, что я до сих пор пробовал, - это создание пользовательской функции агрегирования, передавая ей два столбца 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()
Это, кажется, не работает. Я не могу понять, где я иду не так. Любая помощь приветствуется. Благодарю.