Pyspark 删除数据框列中的多个字符
Posted
技术标签:
【中文标题】Pyspark 删除数据框列中的多个字符【英文标题】:Pyspark removing multiple characters in a dataframe column 【发布时间】:2018-11-18 20:38:12 【问题描述】:查看 pyspark,我看到 translate
和 regexp_replace
帮助我找到数据框列中存在的单个字符。
我想知道是否有办法在 regexp_replace
或 translate
中提供多个字符串,以便解析它们并用其他内容替换它们。
用例:删除 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 删除数据框列中的多个字符的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Python 的数据框列中的字符串中删除非字母数字字符?