ID | 选择1 | val2 |
---|---|---|
1 | 是 | 已标记 |
1 | ñ | 已标记 |
2 | ñ | 已标记 |
2 | 是 | 已标记 |
2 | ñ | 已标记 |
我有上表。我想检查 val1 中具有相同 id 的行,如果至少有一个 Y 和一个 N,那么所有具有 1 作为 id 的行都将在 val2 中标记。此外,为了更高效的代码,我希望代码在找到 Y 后跳转到下一个 id。
假设val1
列仅包含唯一值Y
,N
您可以将数据框分组id
并聚合val1
使用countDistinct
以计算唯一值,然后创建一个flagged
对应于不同计数> 1的条件的新列,最后join
这个新列与原始数据框得到结果
from pyspark.sql import functions as F
counts = df.groupBy('id').agg(F.countDistinct('val1').alias('flagged'))
df = df.join(counts.withColumn('flagged', F.col('flagged') > 1), on='id')
如果 columnval1
可能包含其他值以及Y, N
,则首先屏蔽不在Y
和中的值N
:
vals = F.when(F.col('val1').isin(['Y', 'N']), F.col('val1'))
counts = df.groupBy('id').agg(F.countDistinct(vals).alias('flagged'))
df = df.join(counts.withColumn('flagged', F.col('flagged') > 1), on='id')
>>> df.show()
| id|val1|flagged|
+---+----+-------+
| 1| Y| true|
| 1| N| true|
| 2| N| true|
| 2| Y| true|
| 2| N| true|
+---+----+-------+
PS:我还稍微修改了您的输出,因为flagged
使用布尔值命名的列更有意义
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句