python - PySpark 根据排名创建新列
问题描述
我想根据排名列在 DataFrame 中添加一些新列
所以,我有这张桌子
店铺 | 车 | 价格 | 秩 |
---|---|---|---|
乔的 | 花冠 | 10000 | 1 |
乔的 | HB20 | 5000 | 2 |
乔的 | 甲虫 | 1500 | 3 |
卡尔的 | 高尔夫球 | 7500 | 1 |
卡尔的 | HB20 | 5500 | 2 |
卡尔的 | 欧帕拉 | 4500 | 3 |
卡尔的 | 蒙扎 | 2500 | 4 |
我想 groupBy 存储并创建三个新列,其中包含三辆最昂贵的汽车,如下所示:
店铺 | 1_most_exp_car | 2_most_exp_car | 3_most_exp_car |
---|---|---|---|
乔的 | 花冠 | HB20 | 甲虫 |
卡尔的 | 高尔夫球 | HB20 | 欧帕拉 |
我试图进行排序并制作一个这样的收集列表:
grouped_df.groupBy('Store').agg(F.collect_list("car")).show()
但它返回了一个无序数组
我是 PySpark 的新手,我不知道如何处理它
解决方案
首先做一个过滤器,只保留每家商店最昂贵的汽车,然后做groupby.pivot
:
import pyspark.sql.functions as f
(df.filter(df.rank <= 3)
.withColumn('col', f.expr('concat(rank, "_most_exp_car")'))
.groupby('Store')
.pivot('col')
.agg(f.first(df.Car))
).show()
+------+--------------+--------------+--------------+
| Store|1_most_exp_car|2_most_exp_car|3_most_exp_car|
+------+--------------+--------------+--------------+
|Carl's| Golf| HB20| Opala|
| Joe's| Corolla| HB20| Beetle|
+------+--------------+--------------+--------------+
推荐阅读
- javascript - 如何在 Chromium 扩展中使用键盘快捷键更改 HTML 视频的播放速度?
- wordpress - 由于不允许的 MIME 类型(“image/png”),Google Ads 脚本被阻止
- maven - 使用 docker-compose.yml Dockerizing Multi-maven 项目
- sql - 我们如何从 netezza db 表中获取列的完整记录。?默认情况下,我只得到 1000 条记录
- android - Kotlin 变量值与我分配的不同(从另一个活动类获取)
- matlab - 如何在 App Designer 中绘制 simulink 输出?
- java - Android-Stripe 在创建帐户时添加缺少的参数
- javascript - 使用 CDK 在 API Gateway 方法响应中指定内容类型
- java - 弹簧多对多复合键
- java - org.eclipse.jetty.io.EofException:关闭