如何将多个列的空值替换为来自多个不同列的值

时间:2019-09-14 08:40:03

标签: pyspark

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

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)

1 个答案:

答案 0 :(得分:2)

假设您具有相同数量的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|
+-----+-----+-----+-----+-----+-----+