pyspark 如何在Spark DataFrame中用Null填充空单元格和任何只包含空格的单元格?

p8h8hvxi  于 2022-12-03  发布在  Spark
关注(0)|答案(2)|浏览(289)

我有一个数据集,其中有空单元格,也有只包含空格(一个或多个)的单元格。我想将所有这些单元格转换为Null。
示例数据集:

data = [("", "CA", " "), ("Julia", "", None),("Robert", "  ", None), ("Tom", "NJ", "   ")]
df = spark.createDataFrame(data,["name", "state", "code"])
df.show()

我可以通过以下方式转换空单元格:

df = df.select( [F.when(F.col(c)=="", None).otherwise(F.col(c)).alias(c) for c in df.columns] )
df.show()

和包含一个空格的单元格:

df = df.select( [F.when(F.col(c)==" ", None).otherwise(F.col(c)).alias(c) for c in df.columns] )
df.show()

但是,我不想对有2个、3个或更多空格的单元格重复上述代码。
有没有办法让我一次转化这些细胞?

yzuktlbb

yzuktlbb1#

在应用when-otherwise之前,您可以另外使用trimregex_replace

修剪

df = df.select( [F.when(F.trim(F.col(c))=="", None).otherwise(F.col(c)).alias(c) for c in df.columns] )

正则表达式替换

df = df.select( [F.when(F.regexp_replace(col(c), "^\s+$", ""))=="", None).otherwise(F.col(c)).alias(c) for c in df.columns] )
x6492ojm

x6492ojm2#

您可以使用trim删除空格,从而留下 * 空白 *,然后检查所有单元格中的空白。
参见下面示例

data_sdf. \
    selectExpr(*['if(trim({0}) = "", null, {0}) as {0}'.format(c) for c in data_sdf.columns]). \
    show()

# +------+-----+----+
# |  name|state|code|
# +------+-----+----+
# |  null|   CA|null|
# | Julia| null|null|
# |Robert| null|null|
# |   Tom|   NJ|null|
# +------+-----+----+

列表解析将导致每列的if表达式语句

['if(trim({0}) = "", null, {0}) as {0}'.format(c) for c in data_sdf.columns]

# ['if(trim(name) = "", null, name) as name',
#  'if(trim(state) = "", null, state) as state',
#  'if(trim(code) = "", null, code) as code']

相关问题