Dataframe Pyspark中列的动态唯一组合过滤器
我将df1作为原始数据帧,df2有唯一的A和B组合,结果是取每个唯一组合的金额col的平均值。见下文: df1->df2: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
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|
+---+---+-----------+