python - 组聚合中的算术减法 PySpark
问题描述
我有以下数据框:
ID val1 val2 val3 ...
1 4 1 3 ...
1 5 4 8 ...
2 6 3 6 ...
2 9 2 2 ...
3 2 1 4 ...
3 1 1 4 ...
我需要按 ID 分组/聚合并减去值,产生以下输出:
ID val1 val2 val3 ...
1 -1 -3 -5 ...
2 -3 1 4 ...
3 1 0 0 ...
我目前的方法将一次产生 1 列所需的输出:
from pyspark.sql.functions import first, last
output = df.groupBy('id').agg(first('val1') - (last(col('val1'))))
但是,我的数据集有很多列,我需要为所有列找到一种干净的方法。
解决方案
检查下面的代码。
df
.groupBy(col("id"))
.agg(
(first(col("val1")) - last(col("val1"))).as("val1"),
(first(col("val2")) - last(col("val2"))).as("val2"),
(first(col("val3")) - last(col("val3"))).as("val3")
)
.orderBy(col("id"), ascending=True)
.show(false)
+---+----+----+----+
|id |val1|val2|val3|
+---+----+----+----+
|1 |-1 |-3 |-5 |
|2 |-3 |1 |4 |
|3 |1 |0 |0 |
+---+----+----+----+
aggCols = map(lambda c: (first(col(c)) - last(col(c))).alias(c),filter(lambda c: c != "id", df.columns))
df.groupBy(col("id")).agg(*aggCols).show()
+---+----+----+----+
| id|val1|val2|val3|
+---+----+----+----+
| 1| -1| -3| -5|
| 3| 1| 0| 0|
| 2| -3| 1| 4|
+---+----+----+----+
推荐阅读
- android - 如何在kotlin中添加else条件到takeIf?
- php - 如何使用 PHP 编辑 JSON?
- javascript - 自动将水平滚动条移动到div中的右端
- html - 如何通过打字稿获得img高度
- python - 从excel-第2部分将列表存储到字典中
- mpeg - 如何为 DVBT 实时混合多个 TS 流(来自 IPTV)?
- javascript - 如何在 Azure 函数中使用 Azure 存储表?
- c# - 排序列表
lstNumberDetails 根据 string[] 搜索 - apache-spark - 如何撤消 ALTER TABLE ...添加分区而不删除数据
- java - 如何将mac地址转换为oui查找格式