首页 > 解决方案 > 我可以评估数据框中所有高于 0 的条目的总和吗?

问题描述

我得到了一个 pyspark 数据框,如下所示:

df.show()
+-------+---------+
| class | counter |
+-------+---------+
|     1 |       1 |  <---
|     1 |       0 |
|     1 |       1 |
|     1 |       2 |  <---
|     1 |       0 |
|     1 |       2 |
|     1 |       4 |
+-------+---------+
|     2 |       1 |
|     2 |       2 |
|     2 |       3 |  <---
|     2 |       0 |
|     2 |       1 |
|     2 |       5 |
|     2 |      10 |
+-------+---------+

我现在想得到所有下面有零的数字的总和。示例中的结果将1+2=3适用于 1 类和32 类。

我是这样开始的:

w1 = Window().partitionBy().orderBy("class")

res = df.withColumn(
    "lagged", f.coalesce(f.lag(f.col("COUNTER"), 1).over(w1), f.col("counter"))
)

这会给我一个带有移位计数器值的新列。但是我现在只想过滤具有零的行并将这些值相加以获得每个类的一个值。

你能帮我实现我想要的吗?

标签: pythonpyspark

解决方案


如果没有列来维护顺序,则计算是荒谬的,因为无法保证顺序。

假设您有一个列来维护订单:

df.show()
+--------+-----+-------+                                                        
|ordering|class|counter|
+--------+-----+-------+
|       1|    1|      1|
|       2|    1|      0|
|       3|    1|      1|
|       4|    1|      2|
|       5|    1|      0|
|       6|    1|      2|
|       7|    1|      4|
|       1|    2|      1|
|       2|    2|      2|
|       3|    2|      3|
|       4|    2|      0|
|       5|    2|      1|
|       6|    2|      5|
|       7|    2|     10|
+--------+-----+-------+

然后,您只需要计算滞后值,用 0 过滤行并对滞后值求和。

w = Window().partitionBy("class").orderBy("ordering")

df.withColumn("lagged", F.lag(F.col("COUNTER")).over(w)).where("counter = 0").groupBy(
    "class"
).sum("lagged").show()

+-----+-----------+                                                             
|class|sum(lagged)|
+-----+-----------+
|    1|          3|
|    2|          3|
+-----+-----------+

推荐阅读