Pyspark - взять общую сумму столбца и использовать значение, чтобы разделить другой столбец - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть фрейм данных df

>>> df = spark.createDataFrame([[1,0], [2,1], [3,1], [4,0], [5,1]], ['a', 'b'])
>>> df.show()
+---+---+
|  a|  b|
+---+---+
|  1|  0|
|  2|  1|
|  3|  1|
|  4|  0|
|  5|  1|
+---+---+

и

>>> nrows = df.count()

Используя df, я создал новый фрейм данных a, который представляет собой совокупность df,

>>> a = df.groupby('b').count()
>>> a.show()
+---+-----+
|  b|count|
+---+-----+
|  0|    2|
|  1|    3|
+---+-----+

Мне нужно создать новый столбец в a с именем ev.Значение ev в i-й строке задается как

enter image description here

Это ожидаемый вывод

+---+-----+------------------+
|  b|count|           ev_norm|
+---+-----+------------------+
|  0|    2|              1.25|
|  1|    3|0.8333333333333334|
+---+-----+------------------+

Но сначала я достиг здесь, создав новый столбец num для числителя (nrows-count), который дает 3,2 в двух строках.Затем я приступил к вычислению знаменателя (denom=0.48), который одинаков для всех строк.Наконец, я создал новый столбец, используя .withColumn, который делит столбец num на denom.

. Есть ли способ выполнить вычисление denom на лету без необходимости его предварительного расчетаи выполнить вышеуказанные операции за один шаг?

Я пробовал что-то вроде

a = a.withColumn('ev_norm', (nrows - F.col('count'))/F.sum(F.col('count')*(nrows - F.col('count'))))`

и

a = a.withColumn('ev_norm', (sum([F.col('count')*(nrows-F.col('count'))]))

, но это либо дает мне ошибку, либо неправильный ответ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...