У меня есть фрейм данных 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](https://i.stack.imgur.com/qdpav.gif)
Это ожидаемый вывод
+---+-----+------------------+
| 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'))]))
, но это либо дает мне ошибку, либо неправильный ответ,