首页 > 解决方案 > 如何用来自多个不同列的值替换多个列的空值

问题描述

我有一个如下所示的数据框

data = [
(1, None,7,10,11,19),
(1, 4,None,10,43,58),
(None, 4,7,67,88,91),
(1, None,7,78,96,32)

]
df = spark.createDataFrame(data, ["A_min", "B_min","C_min","A_max", "B_max","C_max"])
df.show() 

我希望将名称显示为“min”的列替换为其等效的 max 列。A_min 列的示例空值应替换为 A_max 列它应该像下面的数据框。

+-----+-----+-----+-----+-----+-----+
|A_min|B_min|C_min|A_max|B_max|C_max|
+-----+-----+-----+-----+-----+-----+
|    1|   11|    7|   10|   11|   19|
|    1|    4|   58|   10|   43|   58|    
|   67|    4|    7|   67|   88|   91|
|    1|   96|    7|   78|   96|   32|
+-----+-----+-----+-----+-----+-----+  

我已经通过定义列尝试了下面的代码,但显然这不起作用。非常感谢任何帮助。

min_cols = ["A_min", "B_min","C_min"]
max_cols = ["A_max", "B_max","C_max"]

for i in min_cols 
df = df.withColumn(i,when(f.col(i)=='',max_cols.otherwise(col(i))))
display(df)

标签: pyspark

解决方案


假设您有相同数量的 max 和 min 列,您可以coalesce与 python 的列表理解一起使用来获得您的解决方案

from pyspark.sql.functions import coalesce

min_cols = ["A_min", "B_min","C_min"]
max_cols = ["A_max", "B_max","C_max"]

df.select(*[coalesce(df[val], df[max_cols[pos]]).alias(val) for pos, val in enumerate(min_cols)], *max_cols).show()

输出:

+-----+-----+-----+-----+-----+-----+
|A_min|B_min|C_min|A_max|B_max|C_max|
+-----+-----+-----+-----+-----+-----+
|    1|   11|    7|   10|   11|   19|
|    1|    4|   58|   10|   43|   58|
|   67|    4|    7|   67|   88|   91|
|    1|   96|    7|   78|   96|   32|
+-----+-----+-----+-----+-----+-----+

推荐阅读