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 的所有行