python - 在 PySpark 中为每一行查找最新的非空值
问题描述
我有一个像这样的 PySpark 数据框,
+----------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|id |201806|201807|201808|201809|201810|201811|201812|201901|201902|201903|201904|201905|201906|
+----------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 1 | 15| 15| 15| 15| 15| 15| 15| 15| 15| null| 15| 15| 15|
| 2 | 4| 4| 4| 4| 4| 4| 4| 4| 4| 4| 4| 4| 4|
| 3 | 7| 7| 7| 7| 7| 7| 7| 7| null| null| null| null| null|
-------------------------------------------------------------------------------------------------------
从这些数据中,我想为每一行找到最新的非空值。
我期待得到以下结果。
+----------+------+
|id. |latest|
+----------+------+
| 1 | 15|
| 2 | 4|
| 3 | 7|
-------------------
我遵循了这个答案,但我无法按行进行操作。
我用了,
df.select([last(x, ignorenulls=True).alias(x) for x in df.columns])
但是此代码仅按列执行,我希望按行执行相同的操作。
解决方案
假设您的列是从最旧到最新排序的,您可以使用下面的代码coalesce
来获取最新值。
from pyspark.sql.functions import coalesce
df.select('id', coalesce(*[i for i in df.columns[::-1] if i != 'id']).alias('latest')).show()
输出:
+---+------+
| id|latest|
+---+------+
| 1| 15|
| 2| 4|
| 3| 7|
+---+------+
推荐阅读
- javascript - 带有可点击子菜单的响应式菜单,可根据屏幕大小改变位置
- service-accounts - Google 服务帐户到用户帐户
- django - initdb:错误:无法创建目录“./PostgreSQL”:权限被拒绝
- python-2.7 - CentOS 7:重新安装 python2.7 和 yum
- html - ASP.NET Core 3 MVC:输入类型日期不从 asp-for 刷新
- excel - 删除带有名称标准的 Excel 表格
- java - 一个 API 的 Rest api 设计,可以使用三种不同类型的 json 请求
- node.js - 将可读对象标准输出进程重定向到节点中的文件
- python - 为什么我不能在一个块中添加 for 循环而不发生缩进错误?
- python - 使用 pandas 库查找两个字符串之间相似性的最有效方法是什么?