apache-spark - pyspark中的反向分组功能?
问题描述
样本数据:
+-----------+------------+---------+
|City |Continent | Price|
+-----------+------------+---------+
| A | Asia | 100|
| B | Asia | 110|
| C | Africa | 60|
| D | Europe | 170|
| E | Europe | 90|
| F | Africa | 100|
+-----------+------------+---------+
输出:对于第二列,我知道我们可以使用
df.groupby("Continent").agg({'Price':'avg'})
但是我们如何计算第三列呢?第三列按不属于每个大陆的城市分组,然后计算平均价格。
预期产出
------------+--------------+----------------------------------------------+
|Continent | Average Price|Average Price for cities not in this continent|
+-----------+--------------+----------------------------------------------+
| Asia | 105| 105 |
| Africa | 80| 117.5 |
| Europe | 130| 92.5 |
+-----------+--------------+----------------------------------------------+
解决方案
>>> from pyspark.sql.functions import col,avg
>>> df.show()
+----+---------+-----+
|City|Continent|Price|
+----+---------+-----+
| A| Asia| 100|
| B| Asia| 110|
| C| Africa| 60|
| D| Europe| 170|
| E| Europe| 90|
| F| Africa| 100|
+----+---------+-----+
>>> df1 = df.alias("a").join(df.alias("b"), col("a.Continent") != col("b.Continent"),"left").select(col("a.*"), col("b.price").alias("b_price"))
>>> df1.groupBy("Continent").agg(avg(col("Price")).alias("Average Price"), avg(col("b_price")).alias("Average Price for cities not in this continent")).show()
+---------+-------------+----------------------------------------------+
|Continent|Average Price|Average Price for cities not in this continent|
+---------+-------------+----------------------------------------------+
| Europe| 130.0| 92.5|
| Africa| 80.0| 117.5|
| Asia| 105.0| 105.0|
+---------+-------------+----------------------------------------------+
推荐阅读
- r - 在 SpatialDataFrame 中将两列合并为一列,但在 R 中省略 NA
- node.js - 由于运行的节点版本低于支持的 TFS 自动构建错误
- android-studio - 在 Web 视图上保持 SIgned 的 web whats_App
- pandas - 熊猫编码德语
- intellij-idea - 在 intellij 中右键单击“运行”运行 TestNG 而不是主
- matlab - 如何在 MATLAB 中读取 .txt 文件的特定行
- mysql - MySQL 加入查询。只显示不存在的条目
- ios - 如何从 tableView 单元格内的 collectionView 的 didSelectItemAt 导航到 viewController?
- shell - 是否有不输出到标准输出的 tee 等价物?
- c - gdb 可以打印由 C write() 函数写入的缓冲区的内容吗?