Dataframe Pyspark中列的动态唯一组合过滤器

Dataframe Pyspark中列的动态唯一组合过滤器,dataframe,pyspark,apache-spark-sql,Dataframe,Pyspark,Apache Spark Sql,我将df1作为原始数据帧,df2有唯一的A和B组合,结果是取每个唯一组合的金额col的平均值。见下文: df1->df2: composition=df1.交叉表(“A”、“B”) 现在可以使用df2中当前的值应用过滤器,但挑战是df2可以是动态的,因为df1随时间变化。因此,无法手动修复过滤器。(如下所示) 需要读取和映射df2组合以高效地过滤和获得结果。如果要保留第一个数据帧,请使用窗口 import pyspark.sql.functions as f from pyspark.sql

我将df1作为原始数据帧,df2有唯一的A和B组合,结果是取每个唯一组合的金额col的平均值。见下文:

df1->df2

composition=df1.交叉表(“A”、“B”)
现在可以使用df2中当前的值应用过滤器,但挑战是df2可以是动态的,因为df1随时间变化。因此,无法手动修复过滤器。(如下所示)


需要读取和映射df2组合以高效地过滤和获得结果。

如果要保留第一个数据帧,请使用
窗口

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 by已经实现了不同的列组合

df.groupBy('A', 'B').avg('Amount').show()

+---+---+-----------+
|  A|  B|avg(Amount)|
+---+---+-----------+
|AI8|AI5|       50.0|
|AI3|AI5|       20.0|
|AI5|AI3|       80.0|
+---+---+-----------+

对不起,我要查找的结果是df1+Avg列,因此可能
df1.join(df.groupBy('A','B').Avg('Amount'),'left')
。将编辑问题。谢谢。那你最好用窗户。
df.groupBy('A', 'B').avg('Amount').show()

+---+---+-----------+
|  A|  B|avg(Amount)|
+---+---+-----------+
|AI8|AI5|       50.0|
|AI3|AI5|       20.0|
|AI5|AI3|       80.0|
+---+---+-----------+