当满足条件时,Pyspark仅乘以一些列值,否则保持相同值

gijlo24d  于 2022-12-22  发布在  Spark
关注(0)|答案(1)|浏览(119)

我有以下数据集

id  col1 ... col10  quantity
0    2        3        0
1    1        4        2
2    0        4        2
3    2        2        0

只有当quantity等于2时,我才想将col1到col10的值乘以2,否则我想保留以前的值。下面是结果的一个示例:

id  col1 ... col10  quantity
0    2        3        0
1    2        8        2
2    0        8        2
3    2        2        0

现在我编写了以下代码:

cols_names = df.drop('id','quantity').columns
df = df.withColumn("arr", F.when(F.col('quantity') == 2, F.struct(*[(F.col(x)* 2).alias(x) for x in\
                  cols_names]))).select("id","quantity","arr.*")

这个方法的唯一问题是当条件不满足时,我得到的是空值而不是保留旧值。当条件不满足时,我怎么能保留旧值呢?或者如果有更简单的方法来做到这一点,那就太好了。

cwxwcias

cwxwcias1#

你需要使用otherwise子句和when子句。如果你不给予otherwise子句,它会在不匹配的情况下使用默认值None

df = df.withColumn("arr", F.when(F.col('quantity') == 2, F.struct(*[(F.col(x)* 2).alias(x) for x in cols_names])).otherwise(F.struct(*[(F.col(x)).alias(x) for x in cols_names]))).select("id","quantity","arr.*")

相关问题