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

У меня есть датафрейм. Я хочу проверить условие между столбцами:

+---+----+------+---------+------+
| ID|Name|Salary|Operation|Points|
+---+----+------+---------+------+
|  1|   A| 10000|  a AND b|   100|
|  1|   A| 10000|   a OR b|   200|
|  1|   A| 10000|otherwise|     0|
|  2|   B|   200|  a AND b|   100|
|  2|   B|   200|   a OR b|   200|
|  2|   B|   200|otherwise|     0|
|  3|   C|   700|  a AND b|   100|
|  3|   C|   700|   a OR b|   200|
|  3|   C|   700|otherwise|     0|
|  4|   D|  1000|  a AND b|   100|
|  4|   D|  1000|   a OR b|   200|
|  4|   D|  1000|otherwise|     0|
|  5|   E|   650|  a AND b|   100|
|  5|   E|   650|   a OR b|   200|
|  5|   E|   650|otherwise|     0|
+---+----+------+---------+------+

Где:

a='salary==1000'
b='salary>500'

Если операция будет выполнена, баллы будут назначены, и новый столбец будет добавлен в фрейм данных по имени например если произойдет первая запись A с зарплатой 10000, проверьте условие a, если зарплата равна 1000, а зарплата больше 500, поэтому a AND b false, поэтому 0 баллов начисляется Результат:

+---+----+------+------+
| ID|Name|Salary|Reward|
+---+----+------+------+
|  1|   A| 10000|   200|
|  2|   B|   200|     0|
|  3|   C|   700|   200|
|  4|   D|  1000|   200|
|  5|   E|   650|   200|
+---+----+------+------+

1 Ответ

0 голосов
/ 03 июня 2019

Вы можете собрать что-то вместе с фильтром выражением и groupby :

import pyspark.sql.functions as F

l = [
(  1,   'A', 10000,  'a AND b',   100),
(  1,   'A', 10000,   'a OR b',   200),
(  1,   'A', 10000,'otherwise',     0),
(  2,   'B',   200,  'a AND b',   100),
(  2,   'B',   200,   'a OR b',   200),
(  2,   'B',   200,'otherwise',     0),
(  3,   'C',   700,  'a AND b',   100),
(  3,   'C',   700,   'a OR b',   200),
(  3,   'C',   700,'otherwise',     0),
(  4,   'D',  1000,  'a AND b',   100),
(  4,   'D',  1000,   'a OR b',   200),
(  4,   'D',  1000,'otherwise',     0),
(  5,   'E',   650,  'a AND b',   100),
(  5,   'E',   650,   'a OR b',   200),
(  5,   'E',   650,'otherwise',     0)]

columns = ['ID','Name','Salary','Operation','Points']

df=spark.createDataFrame(l, columns)

df.filter(
          (df.Operation.contains('AND')        & (df.Salary == 1000) & (df.Salary > 500))    |
          (df.Operation.contains('OR')         & ((df.Salary == 1000) | (df.Salary > 500)))  |
          df.Operation.contains('otherwise') 
          ).groupBy('ID', 'Name', 'Salary').agg(F.max('Points').alias('Rewards')).show()

Выход:

+---+----+------+-------+ 
| ID|Name|Salary|Rewards| 
+---+----+------+-------+ 
|  1|   A| 10000|    200| 
|  2|   B|   200|      0| 
|  3|   C|   700|    200| 
|  5|   E|   650|    200| 
|  4|   D|  1000|    200| 
+---+----+------+-------+

Пожалуйста, такжевзгляните на аналогичный вопрос и ответ Шана.

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