Как я могу применить ту же операцию между многими столбцами в pyspark - PullRequest
0 голосов
/ 30 января 2020

Мне нужно применить логическое ИЛИ '|' между многими столбцами и создать новый столбец в pyspark. Каков наилучший способ сделать это, когда у вас много столбцов с логическими значениями, и необходимо создать столбец результата, который является логическим ИЛИ всех столбцов. Например, если у меня есть фрейм данных df

data = [(True,False,True),
         (False,False,True),
         (True,True,True),
       (False,True,False),
       (True,False,False)]
     df = sc.parallelize(data).toDF(['ID', 'date'])

+-----+-----+-----+
|    a|    b|    c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+

Как добавить столбец 'd', как показано ниже, применив логическое ИЛИ

+-----+-----+-----+-----+
|    a|    b|    c|    d|
+-----+-----+-----+-----+
| true|false| true| true|
|false|false| true| true|
| true| true| true| true|
|false| true|false| true|
| true|false|false| true|
+-----+-----+-----+-----+

Ответы [ 2 ]

1 голос
/ 30 января 2020

Вы можете поместить входные столбцы в список и использовать reduce для динамического построения логического выражения. Затем присвойте результаты новым столбцам.

Вот реализация:

>>> from functools import reduce
>>> from pyspark.sql import functions as f
>>> data
[(True, False, True), (False, False, True), (True, True, True), (False, True, False), (True, False, False)]
>>> df = sc.parallelize(data).toDF(['a', 'b', 'c'])
>>> df.show()
+-----+-----+-----+
|    a|    b|    c|
+-----+-----+-----+
| true|false| true|
|false|false| true|
| true| true| true|
|false| true|false|
| true|false|false|
+-----+-----+-----+
>>> columns = ['a', 'b', 'c']
>>> df.withColumn('and', reduce(lambda x, y: x & y, [f.col(c) for c in columns])).show()
+-----+-----+-----+-----+
|    a|    b|    c|  and|
+-----+-----+-----+-----+
| true|false| true|false|
|false|false| true|false|
| true| true| true| true|
|false| true|false|false|
| true|false|false|false|
+-----+-----+-----+-----+

>>> df.withColumn('or', reduce(lambda x, y: x | y, [f.col(c) for c in columns])).show()
+-----+-----+-----+----+
|    a|    b|    c| or|
+-----+-----+-----+----+
| true|false| true|true|
|false|false| true|true|
| true| true| true|true|
|false| true|false|true|
| true|false|false|true|
+-----+-----+-----+----+
0 голосов
/ 30 января 2020

принимает в качестве условия логическую колонку. При использовании PySpark часто полезно думать о «выражении столбца» при чтении «столбца».

Логические операции над столбцами PySpark используют побитовые операторы:

  • & for и
  • | for или
  • ~ for not

При объединении этих операторов сравнения, таких как <, часто требуются круглые скобки. </p>

В вашем случае правильное утверждение:

import pyspark.sql.functions as F
df = df.withColumn('d',
F.when((df.a == "true") | (df.b == 'true') | (df.c == "true"), "true").otherwise(df.d))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...