python - 具有多个聚合的 Pyspark Pivot
问题描述
我有:
d = [(100,1,23,10),(100,2,45,11),(100,3,67,12),(100,4,78,13),(101,1,23,10),(101,2,45,13),(101,3,67,14),(101,4,78,15),(102,1,23,10),(102,2,45,11),(102,3,67,16),(102,4,78,18)]
mydf = spark.createDataFrame(d,['id','day','price','units'])
mydf.show()
+---+---+-----+-----+
| id|day|price|units|
+---+---+-----+-----+
|100| 1| 23| 10|
|100| 2| 45| 11|
|100| 3| 67| 12|
|100| 4| 78| 13|
|101| 1| 23| 10|
|101| 2| 45| 13|
|101| 3| 67| 14|
|101| 4| 78| 15|
|102| 1| 23| 10|
|102| 2| 45| 11|
|102| 3| 67| 16|
|102| 4| 78| 18|
+---+---+-----+-----+
我想要:
+---+-----+----+----+----+----+
| id| ? | 1| 2| 3| 4|
+---+-----+----+----+----+----+
|100|units|10.0|11.0|12.0|13.0|
|101|units|10.0|13.0|14.0|15.0|
|102|units|10.0|11.0|16.0|18.0|
|100|price|23.0|45.0|67.0|78.0|
|101|price|23.0|45.0|67.0|78.0|
|102|price|23.0|45.0|67.0|78.0|
+---+-----+----+----+----+----+
其中每个值是 和 的price
平均值units
。
我可以只做两个枢轴,用price
and聚合units
,比如:
mydf.groupby('id').pivot('day').agg(F.mean('units')).show()
和
mydf.groupby('id').pivot('day').agg(F.mean('price')).show()
然后加入它。
但我觉得有一种更聪明的方法可以做到这一点。有没有?
解决方案
这是一种方法(基本上熔化 DF,然后旋转)
# First combine price and units into a map column
mydf = mydf.withColumn("price_units", F.create_map(F.lit("price"), "price", F.lit("units"), "units"))
# Now explode to get a melted dataframe
mydf = mydf.select("id", "day", F.explode("price_units").alias("name", "value"))
+---+---+-----+-----+
| id|day| name|value|
+---+---+-----+-----+
|100| 1|price| 23|
|100| 1|units| 10|
|100| 2|price| 45|
|100| 2|units| 11|
|100| 3|price| 67|
etc
# Then pivot
mydf.groupby("id", "name").pivot("day").agg(F.mean("value")).show()
+---+-----+----+----+----+----+
| id| name| 1| 2| 3| 4|
+---+-----+----+----+----+----+
|100|price|23.0|45.0|67.0|78.0|
|101|price|23.0|45.0|67.0|78.0|
|102|units|10.0|11.0|16.0|18.0|
|100|units|10.0|11.0|12.0|13.0|
|101|units|10.0|13.0|14.0|15.0|
|102|price|23.0|45.0|67.0|78.0|
+---+-----+----+----+----+----+
推荐阅读
- r - 将一组列中的非零值与 R 中的最后一列相关联
- css - Ionic - 使用 CSS 选择“焦点”
- r - 根据数据框中其他列中的分组值计算列的平均值
- nginx - 使用 NGINX 时,如何将本地文件和代理 API 请求提供给不同的服务器?
- javascript - 画布不显示线条
- matlab - 在matlab中隐藏和打印绘图
- excel - Excel数据验证:将字符串与范围连接
- excel - 从 2013 版到 2007 版的 excel 断开链接?
- mysql - 使用适用于 MySQL 和 SQL Server 的连接进行更新
- python - 从 Jupyter Notebooks 使用 Azure Devops python 库