在 PySpark 中使用列条件替换空值

Posted

技术标签:

【中文标题】在 PySpark 中使用列条件替换空值【英文标题】:Null values not getting replaced using with column condition in PySpark 【发布时间】:2020-12-08 10:46:21 【问题描述】:

我编写了一个 PySpark 代码来设置条件,如果给定列中存在空值,则它将“是”附加到另一列,否则为“否”

data = data.withColumn('Coupon_code',when((data.coupon ==""),"No coupon").otherwise("coupon"))

这里的条件是在“优惠券”列上,如果“优惠券”列中有空值,那么它会在 Coupon_code 列中附加“无优惠券”,否则在“优惠券”列中附加“优惠券”

上述逻辑的问题是它没有检测空值并用“优惠券”填充每个条目

我尝试使用 isnull()subset 但无济于事

data = data.withColumn('Coupon_code',when(data.fillna("No coupon", subset["coupon"])).otherwise("coupon"))

for is null() 我收到column is not callable 的错误。请提出我哪里出错了。

样本数据:

I/P:

Coupon
null
null
null
null
H45X
E4R
null

预期 o/p:

Coupon  Coupon_code
null     No Coupon
null     No Coupon
null     No Coupon
null     No Coupon
H45X     coupon
E4R      coupon
null     No Coupon

即使计数有效,但替换它时无法复制。

data.where(col("coupon").isNull()).count()

output: 9064

【问题讨论】:

请发布示例数据 您确定缺失值是空字符串 ("") 而不是例如空格 (" ")? @LiamGalbraith 是的,这些是空字符串。都是空/无数据类型 'coupon' 列的 dtype 是字符串 【参考方案1】:

试试下面的代码是否适合你?它应该捕获列 coupon 为 null 或为空字符串的两种情况。

import pyspark.sql.functions as F

data = data.withColumn('Coupon_code',
    F.when(
        F.col('coupon').isNull() | (F.col('coupon') == F.lit('')),
        "No coupon"
    ).otherwise("coupon")
)

【讨论】:

是的,现在我可以看到无优惠券部分也在填充。知道为什么 isnull() 不能在 df.col.isnull() 上运行它给出错误列的任何想法都不是可调用函数 应该是isNull,而不是isnull。

以上是关于在 PySpark 中使用列条件替换空值的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark Dataframe Imputations - 根据指定条件用列平均值替换未知和缺失值

如何在 PySpark 中编写条件正则表达式替换?

PySpark - 根据条件填充特定行

为 pyspark 数据帧的每一行评估多个 if elif 条件

从 Pyspark 中的数据框中计算空值和非空值

用另一个表中的列值替换列的空值