Pyspark:如果具有特定 id 的任何行包含 null,如何根据另一列派生新列的值?

Posted

技术标签:

【中文标题】Pyspark:如果具有特定 id 的任何行包含 null,如何根据另一列派生新列的值?【英文标题】:Pyspark: How to derive a new column's value based on another column if any of the rows with specific id contains null? 【发布时间】:2021-08-12 15:48:32 【问题描述】:

假设我有一张桌子:

id Feature
1 a
1 b
1 c
1 null
2 a
2 b
2 c
3 a
3 b
3 null

结果表应该是:

id Feature Contains null
1 a True
1 b True
1 c True
1 null True
2 a False
2 b False
2 c False
3 a True
3 b True
3 null True

因为 id 1 和 3 在 Feature 列中有一行为 null。

【问题讨论】:

【参考方案1】:

在pyspark中,你需要一个窗口函数:

from pyspark.sql import functions as F, Window as W
w = W.partitionBy("id").orderBy("id")
df.withColumn("Contains_Null",F.max(F.col("Feature").isNull()).over(w)).show()

+---+-------+-------------+
| id|Feature|Contains_Null|
+---+-------+-------------+
|  1|      a|         true|
|  1|      b|         true|
|  1|      c|         true|
|  1|   null|         true|
|  2|      a|        false|
|  2|      b|        false|
|  2|      c|        false|
|  3|      a|         true|
|  3|      b|         true|
|  3|   null|         true|
+---+-------+-------------+

【讨论】:

【参考方案2】:

由于您标记了 pandas,这非常简单:

df['Contains null'] = df.groupby('id')['Feature'].transform(lambda x: x.isna().any())

输出:

   id Feature  Contains null
0   1       a           True
1   1       b           True
2   1       c           True
3   1     NaN           True
4   2       a          False
5   2       b          False
6   2       c          False
7   3       a           True
8   3       b           True
9   3     NaN           True

【讨论】:

我将在 pyspark 中寻找相同的功能

以上是关于Pyspark:如果具有特定 id 的任何行包含 null,如何根据另一列派生新列的值?的主要内容,如果未能解决你的问题,请参考以下文章

如果 ID 在任何行中具有特定值,则更改值

在 PySpark 中提取特定行

使用 pyspark 读取多个 csv 文件

如果这些行中至少有一个具有给定值,则选择具有给定 ID 的所有行

如果有 id 重复,则选择所有行,然后选择具有特定类型的(2 个)

数据库:如果任何行中的字段 X 具有值 Y,则排除“分组依据”组