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)
解决方案
假设您有相同数量的 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|
+-----+-----+-----+-----+-----+-----+
推荐阅读
- r - R中的数值导数?
- elasticsearch - Elasticsearch 查询 geo_polygon 是否在多多边形内
- javascript - 基于来自 javascript 的变量的 HTML 中的条件复选标记或交叉标记
- javascript - 为什么我的 window.scroll 函数仅在声明变量时触发两次?
- javascript - 重新加载页面时,localStorage 返回 undefined
- python - 如何进行下面的稀疏矩阵减法?
- docker - 在 Dockerfile 中下载并解压文件
- r - 总结和 NA
- python - 如果客户端与它断开连接,Python TCP 服务器将关闭
- c# - C#如何将打印屏幕上传到FTP而不保存到驱动器