在 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 - 根据指定条件用列平均值替换未知和缺失值