Найти список всех столбцов, значение которых находится между указанными c столбцами в PySpark Dataframe - PullRequest
1 голос
/ 09 февраля 2020

У меня есть Spark DF, который состоит из 20 столбцов, из которых я хочу найти, какое значение столбца находится между значениями столбцов High и Low.

Time,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,High,Low
09:16,930.9476296,927.4296671,924.1894385,923.2636589,921.6898335,920.578898,919.4679625,918.171871,915.95,913.728129,912.4320375,911.321102,910.2101665,908.6363411,907.7105615,904.4703329,900.9523704,919.95,917.65

Я попробовал следующую команду, и она выдала ошибку:

joineddata.withColumn('RR', map(lambda x: [x], ((F.col(x) >= (F.col('Low')) & (F.col(x) <= (F.col('High')) for x in joineddata.columns[1:18]))))).show()

Ошибка :

Ошибка типа: Столбец не iterable

Желаемый результат :

Я хочу получить новый столбец, представляющий собой список имен столбцов, значение которых находится в пределах от High до Low столбец.

Time,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,High,Low,RR
09:16,930.9476296,927.4296671,924.1894385,923.2636589,921.6898335,920.578898,919.4679625,918.171871,915.95,913.728129,912.4320375,911.321102,910.2101665,908.6363411,907.7105615,904.4703329,900.9523704,919.95,917.65,[2,1]

1 Ответ

2 голосов
/ 09 февраля 2020

Просто соберите имена столбцов в массиве, используя when и between, чтобы проверить, удовлетворяет ли столбец условию, и затем отфильтруйте полученный массив, чтобы удалить нулевые значения (столбцы, которые не удовлетворяют условию):

df = joineddata.withColumn('RR', array(*[when(col(c).between(col('Low'), col("High")), lit(c)) for c in df.columns[1:18]]))\
               .withColumn('RR', expr("filter(RR, x -> x is not null)"))

df.select("Time", "RR").show()

#+-----+------+
#| Time|    RR|
#+-----+------+
#|09:16|[2, 1]|
#+-----+------+

Обратите внимание, что на втором шаге используется функция filter, которая доступна только в Spark 2.4+. Для более старых версий вы можете использовать UDF.

...