python - 我可以评估数据框中所有高于 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 类和3
2 类。
我是这样开始的:
w1 = Window().partitionBy().orderBy("class")
res = df.withColumn(
"lagged", f.coalesce(f.lag(f.col("COUNTER"), 1).over(w1), f.col("counter"))
)
这会给我一个带有移位计数器值的新列。但是我现在只想过滤具有零的行并将这些值相加以获得每个类的一个值。
你能帮我实现我想要的吗?
解决方案
如果没有列来维护顺序,则计算是荒谬的,因为无法保证顺序。
假设您有一个列来维护订单:
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|
+-----+-----------+
推荐阅读
- javascript - Selectize.js - 如何在使用 ajax 请求创建后更新选项并选择最后一个?
- python - 不明白这个 pytz AttributeError: 'UTC' object has no attribute 'utc_timezone'
- flutter - Flutter ListTile 缺少必需的参数
- javascript - 未在页面上隐藏 lit-element 应用程序的表单
- python - Python程序无法正确响应非英文键盘输入
- java - 无法使用 htmlunit 驱动程序执行单击或发送键
- intellij-idea - 数字占位符,例如 IntelliJ 实时模板中的 VSCode 片段
- python - 我如何将此 json.dumps() 传递给要使用的函数?
- python - 基于 Python/MySQL 的管道中的字符编码问题
- vue.js - Vue 组件,观察到的数据没有按预期工作