Как заполнить столбец в фрейме данных pyspark значением другого столбца на основе условия для некоторых других столбцов - PullRequest
0 голосов
/ 11 января 2019

Может кто-нибудь ответить на вопрос по ссылке ниже, но в pyspark?

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

Я повторяю вопрос здесь снова:

Предположим, что у нас есть датафрейм в pyspark следующим образом:

col1 | col2 | col3 | col4 
22   | null | 23   |  56
12   |  54  | 22   |  36
48   | null | 2    |  45
76   | 32   | 13   |  6
23   | null | 43   |  8
67   | 54   | 56   |  64
16   | 32   | 32   |  6
3    | 54   | 64   |  8
67   | 4    | 23   |  64

Я хочу заменить значение col4 на col1, если col4<col1 и col2 не null

Таким образом, результат должен быть

col1 | col2 | col3 | col4 
22   | null  | 23   |  56
12   |  54   | 22   |  36
48   | null  | 2    |  45
76   | 32    | 13   |  76
23   | null  | 43   |  8
67   | 54    | 56   |  67
16   | 32    | 32   |  16
3    | 54    | 64   |  8
67   | null  | 23   |  64

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 11 января 2019
from pyspark.sql.functions import when, col
values = [(22  ,None ,23  , 56), (12, 54, 22, 36), (48 ,None,2 , 45), (76, 32, 13, 6), (23, None, 43, 8), 
(67, 54, 56, 64), (16, 32, 32, 6), (3, 54, 64, 8), (67, 4, 23, 64)]
df = sqlContext.createDataFrame(values,['col1','col2','col3','col4'])
df.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|  22|null|  23|  56|
|  12|  54|  22|  36|
|  48|null|   2|  45|
|  76|  32|  13|   6|
|  23|null|  43|   8|
|  67|  54|  56|  64|
|  16|  32|  32|   6|
|   3|  54|  64|   8|
|  67|   4|  23|  64|
+----+----+----+----+

df = df.withColumn('col4',when((col('col4')<col('col1')) & col('col2').isNotNull(),col('col1')).otherwise(col('col4')))
df.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|  22|null|  23|  56|
|  12|  54|  22|  36|
|  48|null|   2|  45|
|  76|  32|  13|  76|
|  23|null|  43|   8|
|  67|  54|  56|  67|
|  16|  32|  32|  16|
|   3|  54|  64|   8|
|  67|   4|  23|  67|
+----+----+----+----+
0 голосов
/ 11 января 2019

Это решит вашу проблему:

from pyspark.sql.functions import col, when

condition_col = (col('col4') < col('col1')) & (col('col2').isNotNull())
df = df.withColumn('col4', when(condition_col, col('col1')).otherwise(col('col4')))

when(cond, result1).otherwise(result2) работает как предложение if / else со столбцами.

Для логических операторов столбцов используйте: & для and; | для or; ~ для not.

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