Групповые операции на нескольких столбцах Pyspark - PullRequest
0 голосов
/ 15 апреля 2019

Я применил групповой режим и вычислил стандартное отклонение для двух объектов в фрейме данных pyspark

from pyspark.sql import functions as f


val1 = [('a',20,100),('a',100,100),('a',50,100),('b',0,100),('b',0,100),('c',0,0),('c',0,50),('c',0,100),('c',0,20)]
cols = ['group','val1','val2']
tf = spark.createDataFrame(val1, cols)
tf.show() 
tf.groupby('group').agg(f.stddev(['val1','val2']).alias('val1_std','val2_std'))

но это дает мне следующую ошибку

TypeError: _() takes 1 positional argument but 2 were given

Как это сделать в писпарке?

1 Ответ

1 голос
/ 15 апреля 2019

Проблема в том, что функция stddev действует на один столбец, а не на несколько столбцов, как в написанном вами коде (отсюда и сообщение об ошибке 1 против 2 аргументов).Один из способов получить то, что вы ищете, - это рассчитать стандартное отклонение отдельно для каждого столбца:

# std dev for each col
expressions = [f.stddev(col).alias('%s_std'%(col)) for col in ['val1','val2']]
# Now run it
tf.groupby('group').agg(*expressions).show()

#+-----+------------------+------------------+
#|group|          val1_std|          val2_std|
#+-----+------------------+------------------+
#|    c|               0.0|43.493294502332965|
#|    b|               0.0|               0.0|
#|    a|40.414518843273804|               0.0|
#+-----+------------------+------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...