【问题标题】:How do I replace a string value with a NULL in PySpark for all my columns in the dataframe?如何在 PySpark 中为数据框中的所有列替换字符串值与 NULL?
【发布时间】: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"))

我试图避免为所有列编写此内容,因为我的数据框中可以有任意数量的列。

感谢您的帮助。谢谢!

【问题讨论】:

    标签: pyspark


    【解决方案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]" 有效吗?
    猜你喜欢
    • 2017-07-07
    • 2016-08-22
    • 2016-08-30
    • 1970-01-01
    • 2019-12-28
    • 2020-08-31
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多