добавить новый столбец в фрейм данных, который укажет, содержит ли другой столбец слово pyspark - PullRequest
0 голосов
/ 20 июня 2020

У меня есть фрейм данных, который я хочу добавить к нему, столбец, который будет указывать, находится ли слово «да» в текстовом столбце этой строки (1, если слово находится в этой строке, 0, если нет), мне нужно поставить 1 в отметьте только, если «да» отображается как слово, а не как подстрока, или если «да» стоит рядом со знаком препинания (пример: да!), как я могу сделать это в Spark? например:

id  group  text
1   a       hey there
2   c       no you can
3   a       yes yes yes
4   b       yes or no
5   b       you need to say yes.
6   a       yes you can
7   d       yes!
8   c       no&
9   b       ok

результат будет:

id  group  text                  check
1   a       hey there             0
2   c       no you can            0
3   a       yes yes yes           1
4   b       yes or no             1
5   b       you need to say yes.  1
6   a       yes you can           1
7   d       yes!                  1
8   c       no&                   0
9   b       ok                    0

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Мне нужно поставить отметку 1 только в том случае, если «да» отображается как слово, а не как подстрока.

Вы можете решить эту проблему, сопоставив text с регулярное выражение, использующее границы слов (\b). Это удобная функция регулярного выражения, которая представляет символы, разделяющие слова (пробелы, знаки препинания и т. Д.).

В SQL вы бы сделали:

select
    t.*
    case when text rlike '\byes\b' then 1 else 0 end as check
from mytable t
2 голосов
/ 20 июня 2020

Вы можете проверить с помощью rlike и преобразовать его в Integer:

import pyspark.sql.functions as F
df.withColumn("check",F.col("text").rlike("yes").cast("Integer")).show()
+---+-----+--------------------+-----+
| id|group|                text|check|
+---+-----+--------------------+-----+
|  1|    a|           hey there|    0|
|  2|    c|          no you can|    0|
|  3|    a|         yes yes yes|    1|
|  4|    b|           yes or no|    1|
|  5|    b|you need to say yes.|    1|
|  6|    a|         yes you can|    1|
|  7|    d|                yes!|    1|
|  8|    c|                 no&|    0|
|  9|    b|                  ok|    0|
+---+-----+--------------------+-----+

Для отредактированного вопроса вы можете попробовать: higher order functions:

import string
import re
pat = '|'.join([re.escape(i) for i in list(string.punctuation)])

(df.withColumn("text1",F.regexp_replace(F.col("text"),pat,""))
.withColumn("Split",F.split("text1"," "))
.withColumn("check",
  F.expr('''exists(Split,x-> replace(x,"","") = "yes")''').cast("Integer"))
.drop("Split","text1")).show()
+---+-----+--------------------+-----+
| id|group|                text|check|
+---+-----+--------------------+-----+
|  1|    a|           hey there|    0|
|  2|    c|          no you can|    0|
|  3|    a|         yes yes yes|    1|
|  4|    b|           yes or no|    1|
|  5|    b|you need to say yes.|    1|
|  6|    a|         yes you can|    1|
|  7|    d|                yes!|    1|
|  8|    c|                 no&|    0|
|  9|    b|               okyes|    0|
+---+-----+--------------------+-----+
...