首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >平移群与按和排序的群除法

平移群与按和排序的群除法
EN

Stack Overflow用户
提问于 2020-04-14 14:56:39
回答 3查看 320关注 0票数 2

我刚开始使用pyspark,对于如何将一些数据按几个列分组,按另一个列排序,然后为每个组添加一个列,然后使用它作为每一行数据的分母来计算组成组的每一行中的权重,我感到很困惑。

这是在jupyterlab中使用pyspark3笔记本完成的。没办法绕开那条路。

这是数据的一个例子..。

代码语言:javascript
复制
+-------+-----+-----------+------------+------+--------+
| ntwrk | zip | zip-ntwrk | event-date | hour | counts |
+-------+-----+-----------+------------+------+--------+
| A     | 1   | 1-A       | 2019-10-10 | 1    | 12362  |
| B     | 3   | 3-B       | 2019-10-10 | 1    | 100    |
| C     | 5   | 5-C       | 2019-10-10 | 1    | 17493  |
| B     | 3   | 3-B       | 2019-10-10 | 4    | 4873   |
| A     | 2   | 2-A       | 2019-10-11 | 1    | 28730  |
| C     | 6   | 6-C       | 2019-10-11 | 1    | 728    |
| C     | 5   | 5-C       | 2019-10-10 | 2    | 9827   |
| A     | 1   | 1-A       | 2019-10-10 | 9    | 13245  |
| B     | 4   | 4-B       | 2019-10-11 | 1    | 3765   |
+-------+-----+-----------+------------+------+--------+

我想按ntrk,zipcode,zip-ntwrk,event-date组合在一起,然后按事件日期和小时顺序排序。每个日期有24小时,所以对于每个压缩-ntwrk组合,我希望看到日期和时间的顺序。就像这样..。

代码语言:javascript
复制
+-------+-----+-----------+------------+------+--------+
| ntwrk | zip | zip-ntwrk | event-date | hour | counts |
+-------+-----+-----------+------------+------+--------+
| A     | 1   | 1-A       | 2019-10-10 | 1    | 12362  |
| A     | 1   | 1-A       | 2019-10-10 | 9    | 3765   |
| A     | 2   | 2-A       | 2019-10-11 | 1    | 28730  |
| B     | 3   | 3-B       | 2019-10-10 | 1    | 100    |
| B     | 3   | 3-B       | 2019-10-10 | 4    | 4873   |
| B     | 4   | 4-B       | 2019-10-11 | 1    | 3765   |
| C     | 5   | 5-C       | 2019-10-10 | 1    | 17493  |
| C     | 5   | 5-C       | 2019-10-10 | 2    | 9827   |
| C     | 6   | 6-C       | 2019-10-11 | 1    | 728    |
+-------+-----+-----------+------------+------+--------+

现在一切就绪,我需要运行一个计算,以创建一个比率,在每小时中有多少计数与每天的总计数相加时的小时数。这将在分母中被用来除以每小时的总计数,从而得到每小时计数与一天总数的比率。所以像这样的..。

代码语言:javascript
复制
+-------+-----+-----------+------------+------+--------+-------+
| ntwrk | zip | zip-ntwrk | event-date | hour | counts | total |
+-------+-----+-----------+------------+------+--------+-------+
| A     | 1   | 1-A       | 2019-10-10 | 1    | 12362  | 16127 |
| A     | 1   | 1-A       | 2019-10-10 | 9    | 3765   | 16127 |
| A     | 2   | 2-A       | 2019-10-11 | 1    | 28730  | 28730 |
| B     | 3   | 3-B       | 2019-10-10 | 1    | 100    | 4973  |
| B     | 3   | 3-B       | 2019-10-10 | 4    | 4873   | 4973  |
| B     | 4   | 4-B       | 2019-10-11 | 1    | 3765   | 3765  |
| C     | 5   | 5-C       | 2019-10-10 | 1    | 17493  | 27320 |
| C     | 5   | 5-C       | 2019-10-10 | 2    | 9827   | 27320 |
| C     | 6   | 6-C       | 2019-10-11 | 1    | 728    | 728   |
+-------+-----+-----------+------------+------+--------+-------+

现在我们有了分母,我们可以将每一行的计数除以总数,从而得到因子计数/总计=因子,这最终看起来就像.

代码语言:javascript
复制
+-------+-----+-----------+------------+------+--------+-------+--------+
| ntwrk | zip | zip-ntwrk | event-date | hour | counts | total | factor |
+-------+-----+-----------+------------+------+--------+-------+--------+
| A     | 1   | 1-A       | 2019-10-10 | 1    | 12362  | 16127 | .766   |
| A     | 1   | 1-A       | 2019-10-10 | 9    | 3765   | 16127 | .233   |
| A     | 2   | 2-A       | 2019-10-11 | 1    | 28730  | 28730 | 1      |
| B     | 3   | 3-B       | 2019-10-10 | 1    | 100    | 4973  | .02    |
| B     | 3   | 3-B       | 2019-10-10 | 4    | 4873   | 4973  | .979   |
| B     | 4   | 4-B       | 2019-10-11 | 1    | 3765   | 3765  | 1      |
| C     | 5   | 5-C       | 2019-10-10 | 1    | 17493  | 27320 | .64    |
| C     | 5   | 5-C       | 2019-10-10 | 2    | 9827   | 27320 | .359   |
| C     | 6   | 6-C       | 2019-10-11 | 1    | 728    | 728   | 1      |
+-------+-----+-----------+------------+------+--------+-------+--------+

这就是我想要做的,任何关于如何做到这一点的建议都会受到极大的赞赏。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-14 15:12:39

使用window sum函数,然后通过ntwrk,zip对窗口分区进行

最后,我们将用counts/total.除以

Example:

代码语言:javascript
复制
from pyspark.sql.functions import *
from pyspark.sql import Window
w = Window.partitionBy("ntwrk","zip","event-date")

df1.withColumn("total",sum(col("counts")).over(w).cast("int")).orderBy("ntwrk","zip","event-date","hour").\
withColumn("factor",format_number(col("counts")/col("total"),3)).show()

#+-----+---+---------+----------+----+------+-----+------+
#|ntwrk|zip|zip-ntwrk|event-date|hour|counts|total|factor|
#+-----+---+---------+----------+----+------+-----+------+
#|    A|  1|      1-A|2019-10-10|   1| 12362|25607| 0.483|
#|    A|  1|      1-A|2019-10-10|   9| 13245|25607| 0.517|#input 13245 not 3765
#|    A|  2|      2-A|2019-10-11|   1| 28730|28730| 1.000|
#|    B|  3|      3-B|2019-10-10|   1|   100| 4973| 0.020|
#|    B|  3|      3-B|2019-10-10|   4|  4873| 4973| 0.980|
#|    B|  4|      4-B|2019-10-11|   1|  3765| 3765| 1.000|
#|    C|  5|      5-C|2019-10-10|   1| 17493|27320| 0.640|
#|    C|  5|      5-C|2019-10-10|   2|  9827|27320| 0.360|
#|    C|  6|      6-C|2019-10-11|   1|   728|  728| 1.000|
#+-----+---+---------+----------+----+------+-----+------+
票数 2
EN

Stack Overflow用户

发布于 2020-04-23 02:08:10

你一定是把样条划成网了

票数 1
EN

Stack Overflow用户

发布于 2020-04-23 03:45:47

Pyspark在分布式体系结构上工作,因此它可能不会保留顺序。因此,在显示记录之前,您应该始终按您所需的方式订购它。

现在,在您的点得到%的记录在不同的水平。您可以使用窗口函数实现相同的分区,按您想要的数据级别进行分区。

类似:W= Window.partitionBy("ntwrk-zip","hour") df =df.withColumn("hourly_recs",F.count().over(w))

此外,您还可以参考YouTube - https://youtu.be/JEBd_4wWyj0中的本教程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61210738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档