Pyspark 删除数据框列中的多个字符

Posted

技术标签:

【中文标题】Pyspark 删除数据框列中的多个字符【英文标题】:Pyspark removing multiple characters in a dataframe column 【发布时间】:2018-11-18 20:38:12 【问题描述】:

查看 pyspark,我看到 translateregexp_replace 帮助我找到数据框列中存在的单个字符。

我想知道是否有办法在 regexp_replacetranslate 中提供多个字符串,以便解析它们并用其他内容替换它们。

用例:删除 A 列中的所有 $、# 和逗号 (,)

【问题讨论】:

【参考方案1】:

您可以使用pyspark.sql.functions.translate() 进行多次替换。传入一串要替换的字母和另一个表示替换值的等长字符串。

例如,假设您有以下 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 |
#+------------------+-------------+

模式"[\$#,]" 表示匹配括号内的任何字符。 $ 必须转义,因为它在正则表达式中具有特殊含义。

【讨论】:

要删除所有实例,您也可以使用translate。不需要切换到regex_replace。我相信以下内容可以完成工作df.select("A", f.translate(f.col("A"), "$#,", "").alias("replaced")).show()【参考方案2】:

如果有人需要在 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)

您可以看到如下输出:

【讨论】:

以上是关于Pyspark 删除数据框列中的多个字符的主要内容,如果未能解决你的问题,请参考以下文章

从字符串 PySpark 数据框列中删除正则表达式

从数据框列中的字符串值中删除字符

如何从 Python 的数据框列中的字符串中删除非字母数字字符?

Pyspark 通过使用另一列中的值替换 Spark 数据框列中的字符串

如何删除数据框列中的空格并向其添加字符串“NA”?

我想从python中数据框列中的字符串链接中删除子字符串