Pyspark удаляет несколько символов в столбце фрейма данных

Глядя на pyspark, я вижу translate и regexp_replace, чтобы помочь мне с одним символом, который существует в столбце фрейма данных.

Мне было интересно, есть ли способ предоставить несколько строк в regexp_replace или translate, чтобы они анализировали их и заменяли чем-то другим.

Пример использования: удалите все $, # и запятую (,) в столбце A.


person E B    schedule 08.06.2018    source источник


Ответы (2)


Вы можете использовать pyspark.sql.functions.translate()< /a>, чтобы сделать несколько замен. Передайте строку букв для замены и другую строку равной длины, которая представляет значения замены.

Например, предположим, что у вас есть следующий DataFrame:

import pyspark.sql.functions as f
df = sqlCtx.createDataFrame([("$100,00",),("#foobar",),("foo, bar, #, and $",)], ["A"])
df.show()
#+------------------+
#|                 A|
#+------------------+
#|           $100,00|
#|           #foobar|
#|foo, bar, #, and $|
#+------------------+

и хотел заменить ('$', '#', ',') на ('X', 'Y', 'Z'). Просто используйте translate как:

df.select("A", f.translate(f.col("A"), "$#,", "XYZ").alias("replaced")).show()
#+------------------+------------------+
#|                 A|          replaced|
#+------------------+------------------+
#|           $100,00|           X100Z00|
#|           #foobar|           Yfoobar|
#|foo, bar, #, and $|fooZ barZ YZ and X|
#+------------------+------------------+

Если вместо этого вы хотите удалить все экземпляры ('$', '#', ','), вы можете сделать это с помощью pyspark.sql.functions.regexp_replace().

df.select("A", f.regexp_replace(f.col("A"), "[\$#,]", "").alias("replaced")).show()
#+------------------+-------------+
#|                 A|     replaced|
#+------------------+-------------+
#|           $100,00|        10000|
#|           #foobar|       foobar|
#|foo, bar, #, and $|foo bar  and |
#+------------------+-------------+

Шаблон "[\$#,]" означает соответствие любому из символов в скобках. $ нужно экранировать, потому что он имеет особое значение в регулярном выражении.

person pault    schedule 08.06.2018

Если кому-то нужно сделать это в scala, вы можете сделать это, как показано ниже:

val df = Seq(("Test$",19),("$#,",23),("Y#a",20),("ZZZ,,",21)).toDF("Name","age")
import org.apache.spark.sql.functions._
val df1 = df.withColumn("NewName",translate($"Name","$#,","xyz"))
display(df1)

Вы можете увидеть вывод, как показано ниже: введите здесь описание изображения

person Nikunj Kakadiya    schedule 05.04.2021