dataframe - 过滤 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 组合以有效过滤和获取结果。
解决方案
如果要保留第一个数据框,请使用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
并获得每个的平均值A
,B
这就是您想要的。那些列的分组方式已经实现了不同的列组合。
df.groupBy('A', 'B').avg('Amount').show()
+---+---+-----------+
| A| B|avg(Amount)|
+---+---+-----------+
|AI8|AI5| 50.0|
|AI3|AI5| 20.0|
|AI5|AI3| 80.0|
+---+---+-----------+
推荐阅读
- pandas - Pandas Dataframe:如何获取单元格而不是值
- android - 如何在 TextInput 中禁用 keyboardAvoidingView 行为
- java - 如何避免 IntelliJ 中可嵌入类的验证错误“无法解析列‘xy’”?
- apify - 从 sitemap.xml 抓取每个链接
- javascript - 在为 React 模块编写单元测试时如何模拟“this”?
- java - 如何使我的 sql 数据可用于我的 Junit 中的所有新事务?
- database - 使用 kubectl 在 DB 中检索与特定 ID 对应的行
- python - 并行异步训练多个神经网络
- python - 在 python 3.7 中替换字符串中的值的问题
- python - 即使更改端口后,Dash 服务器也没有运行