我有df1作为原始数据,df2有独特的A&B组合,结果是取每一个独特组合的数量。见下文:
df1 -> df2
Combination = df1.crosstab("A", "B")
现在可以使用当前在df2中的值应用过滤器,但挑战是,随着df1随时间的变化,df2可以是动态的。因此,不能手动修复过滤器。(见下文)
Result = df1.withColumn("Avg", when(col("A")=="AI3 & col("B")=="AI5), avg(col("Amount"))
………...
需要读取和映射df2组合,以有效地过滤和获得结果。
发布于 2020-08-23 08:43:36
如果要保留第一个数据,请使用Window
。
import pyspark.sql.functions as f
from pyspark.sql import Window
w = Window.partitionBy('A', 'B')
df.withColumn('avg', f.avg('Amount').over(w)).show()
+---+---+------+----+
| A| B|Amount| avg|
+---+---+------+----+
|AI8|AI5| 75|50.0|
|AI8|AI5| 25|50.0|
|AI3|AI5| 20|20.0|
|AI3|AI5| 30|20.0|
|AI3|AI5| 10|20.0|
|AI5|AI3| 80|80.0|
+---+---+------+----+
我不明白你为什么需要数据格式的df2
。只需按df1
分组,得到每个A
和B
的平均值,这就是您想要的。Group表示这些列已经实现了不同的列组合。
df.groupBy('A', 'B').avg('Amount').show()
+---+---+-----------+
| A| B|avg(Amount)|
+---+---+-----------+
|AI8|AI5| 50.0|
|AI3|AI5| 20.0|
|AI5|AI3| 80.0|
+---+---+-----------+
https://stackoverflow.com/questions/63544417
复制相似问题