首页 > 解决方案 > 过滤 Pyspark 中列的动态唯一组合

问题描述

我将 df1 作为原始数据框,df2 具有 A 和 B 的独特组合,并且 Result 采用每个独特组合的 Amount col 的平均值。见下文:

在此处输入图像描述

df1 -> df2

Combination = df1.crosstab("A", "B") 现在可以使用 df2 中当前的值应用过滤器,但挑战在于 df2 可以随着 df1 随时间变化而动态变化。因此,无法手动修复过滤器。(如下图)

Result = df1.withColumn("Avg", when(col("A")=="AI3 & col("B")=="AI5), avg(col("Amount"))
………...

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

标签: dataframepysparkapache-spark-sql

解决方案


如果要保留第一个数据框,请使用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|
+---+---+------+----+

我不明白你为什么需要 dataframe df2。只需按 分组df1并获得每个的平均值AB这就是您想要的。那些列的分组方式已经实现了不同的列组合。

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

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

推荐阅读