如何在 PySpark 中为数据框中的所有列替换字符串值与 NULL?
Posted
技术标签:
【中文标题】如何在 PySpark 中为数据框中的所有列替换字符串值与 NULL?【英文标题】:How do I replace a string value with a NULL in PySpark for all my columns in the dataframe? 【发布时间】:2017-12-06 15:04:58 【问题描述】:例如说我有一个 df
from pyspark.sql import Row
row = Row("v", "x", "y", "z")
df = sc.parallelize([
row("p", 1, 2, 3.0), row("NULL", 3, "NULL", 5.0),
row("NA", None, 6, 7.0), row(float("Nan"), 8, "NULL", float("NaN"))
]).toDF()
现在我想用 pyspark null (None) 值替换 NULL、NA 和 NaN。如何将多个列一起实现。
from pyspark.sql.functions import when, lit, col
def replace(column, value):
return when(column != value, column).otherwise(lit(None))
df = df.withColumn("v", replace(col("v"), "NULL"))
df = df.withColumn("v", replace(col("v"), "NaN"))
df = df.withColumn("v", replace(col("v"), "NaN"))
我试图避免为所有列编写此内容,因为我的数据框中可以有任意数量的列。
感谢您的帮助。谢谢!
【问题讨论】:
【参考方案1】:遍历列,构造用null
替换特定字符串的列表达式,然后用select
列:
df.show()
+----+----+----+---+
| v| x| y| z|
+----+----+----+---+
| p| 1| 2|3.0|
|NULL| 3|null|5.0|
| NA|null| 6|7.0|
| NaN| 8|null|NaN|
+----+----+----+---+
import pyspark.sql.functions as F
cols = [F.when(~F.col(x).isin("NULL", "NA", "NaN"), F.col(x)).alias(x) for x in df.columns]
df.select(*cols).show()
+----+----+----+----+
| v| x| y| z|
+----+----+----+----+
| p| 1| 2| 3.0|
|null| 3|null| 5.0|
|null|null| 6| 7.0|
|null| 8|null|null|
+----+----+----+----+
【讨论】:
能否解释一下“ cols = [F.when(~F.col(x).isin("NULL", "NA", "NaN"), F.col( x)).alias(x) for x in df.columns]" 有效吗?以上是关于如何在 PySpark 中为数据框中的所有列替换字符串值与 NULL?的主要内容,如果未能解决你的问题,请参考以下文章
遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框
如何在 pySpark 中有效地从字符串数据框中替换多个正则表达式模式的所有实例?