GroupBy 和 Sum,如果大于零标记行 True

Posted

技术标签:

【中文标题】GroupBy 和 Sum,如果大于零标记行 True【英文标题】:GroupBy and Sum, If greater than zero mark row True 【发布时间】:2021-05-05 19:49:49 【问题描述】:

假设我有一个如下所示的数据集。我想按 ID 分组,如果所有值都为 NULL,或者总和不大于 0,则创建一个新列,将每一行标记为 True 或 False。

理想的数据集在下面。

ID  VALUE
1    6.00
1    5.00
2    NULL
2    NULL
2    NULL
3    3.00
ID  VALUE   ALL_NULL
1    6.00    False
1    5.00    False
2    NULL    True
2    NULL    True
2    NULL    True
3    3.00    False

这是我迄今为止尝试过的。

df = (
    wbcl_full
    .withColumn('ALL_NULL', F.when((wbcl_full.groupBy('ID').agg(sum('VALUE').collect()[0][0]) == 0), True)
    .otherwise(False))
)
return df

感谢您的帮助!理想情况下,我还没有找到执行条件窗口函数的好方法。在某些情况下,当我根据分组结果进行窗口化时,我想有选择地选择所选择的行。

【问题讨论】:

【参考方案1】:

您可以对按 ID 分区的窗口进行求和,并检查总和是否为空(仅当该 ID 的所有元素都为空时才会发生)或者它是否不大于 0:

from pyspark.sql import functions as F, Window

result = df.withColumn(
    'ALL_NULL', 
    F.sum('VALUE').over(Window.partitionBy('ID')).isNull() | 
    (F.sum('VALUE').over(Window.partitionBy('ID')) <= 0)
)

result.show()
+---+-----+--------+
| ID|VALUE|ALL_NULL|
+---+-----+--------+
|  1|  6.0|   false|
|  1|  5.0|   false|
|  3|  3.0|   false|
|  2| null|    true|
|  2| null|    true|
|  2| null|    true|
+---+-----+--------+

【讨论】:

以上是关于GroupBy 和 Sum,如果大于零标记行 True的主要内容,如果未能解决你的问题,请参考以下文章

如何用零填充 pandas groupby 列表的缺失日期?

jQuery删除除第一行之外的所有表行

Spark数据框:如何在groupBy + sum之后使用

Groupby .cumsum() 如果总和列为零,则为空白?

SUM 行、返回计数和按日期排序

MySQL SUM 如果大于和小于