过滤 Pyspark 中列的动态唯一组合
Posted
技术标签:
【中文标题】过滤 Pyspark 中列的动态唯一组合【英文标题】:Filter on dynamic unique combinations of columns in Pyspark 【发布时间】:2020-08-23 07:25:49 【问题描述】:我将 df1 作为原始数据框,df2 具有 A 和 B 的唯一组合,结果是每个唯一组合的 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 组合以有效过滤和获取结果。
【问题讨论】:
【参考方案1】:如果要保留第一个数据帧,请使用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 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')
。将编辑问题。谢谢。
那你最好使用Window。以上是关于过滤 Pyspark 中列的动态唯一组合的主要内容,如果未能解决你的问题,请参考以下文章
如何遍历大型 Pyspark Dataframe 中列的不同值? .distinct().collect() 引发大任务警告