Процентный расчет и назначение нового столбца в том же фрейме данных

У меня есть фрейм данных искры, как показано ниже:

+-------+----------+-----+
| Status|  date    |count|
+-------+----------+-----+
|Success|2019-09-06|23596|
|Failure|2019-09-06| 2494|
|Failure|2019-09-07| 1863|
|Success|2019-09-07|22399|

Я пытаюсь вычислить процент успеха/неудачи по дате и добавить результат в тот же кадр данных pyspark. Я могу рассчитать по группе, например, только для коэффициента успеха или коэффициента отказов после создания нескольких промежуточных таблиц/фреймов данных. Как мы можем добиться использования одного и того же единого фрейма данных без создания нового промежуточного фрейма данных?

Ожидаемый результат:

+-------+----------+-----+----------------------
| Status|  date    |count| Percent             |
+-------+----------+-----+----------------------
|Success|2019-09-06|23596| =(23596/(23596+2494)*100)
|Failure|2019-09-06| 2494| =(2494/(23596+2494)*100)
|Failure|2019-09-07| 1863| = (1863/(1863 + 22399)*100)
|Success|2019-09-07|22399| = (22399/(1863 + 22399)*100)

person Raj    schedule 16.09.2019    source источник


Ответы (1)


вы можете использовать window над столбцом "дата", чтобы получить одинаковые даты вместе, а затем используйте sum столбец "количество" над этим окном:

import pyspark.sql.functions as F
from pyspark.sql.window import Window

window = Window.partitionBy(['date'])
df = df.withColumn('Percent', F.col('count')/F.sum('count').over(window)*100)

df.show()
+-------+-------------------+-----+-----------------+
| Status|               date|count|          Percent|
+-------+-------------------+-----+-----------------+
|Failure|2019-09-07 00:00:00| 1883|7.754715427065316|
|Success|2019-09-07 00:00:00|22399|92.24528457293468|
|Success|2019-09-06 00:00:00|23596|90.44078190877731|
|Failure|2019-09-06 00:00:00| 2494|9.559218091222691|
+-------+-------------------+-----+-----------------+
person Ben.T    schedule 16.09.2019