如何解决pyspark检测类别变量的变化
我有一个由两列组成的spark数据框。
+-----------------------+-----------+
| Metric|Recipe_name|
+-----------------------+-----------+
| 100. | A |
| 200. | A |
| 300. | A |
| 10. | A |
| 20. | A |
| 10. | B |
| 20. | B |
| 10. | A |
| 20. | A |
| .. | .. |
| .. | .. |
| 10. | B |
数据帧是按时间排序的(您可以想象时间戳列会增加)。我需要添加一列“周期”。当我说一个新的周期开始时,有两种情况:
- 如果运行相同的配方,则说配方“ A”,而“公制”的值减小(相对于最后一行),则新的周期开始。
- 让我们说我们从当前的配方'A'切换到第二个配方'B',然后切换回配方'A',我们说配方'A'的新周期已经开始。
所以最后我想有一列“ Cycle”,看起来像这样:
+-----------------------+-----------+-----------+
| Metric|Recipe_name| Cycle|
+-----------------------+-----------+-----------+
| 100. | A | 0 |
| 200. | A | 0 |
| 300. | A | 0 |
| 10. | A | 1 |
| 20. | A | 1 |
| 10. | B | 0 |
| 20. | B | 0 |
| 10. | A | 2 |
| 20. | A | 2 |
| .. | .. | 2 |
| .. | .. | 2 |
| 10. | B | 1 |
因此,这意味着配方A
的周期为0
,然后指标减少,周期更改为1
。
然后新的配方开始B
,因此它具有一个新的周期0
。
然后再次回到配方A
,我们说配方A
的新周期开始了,关于最后一个周期号,它具有周期2
(对于配方B
也是如此) )。
总共有200个食谱。
感谢您的帮助。
解决方法
将我的订单列替换为您的订单列。在分区lag
的地方使用Recipe_name
函数比较您的情况。
w = Window.partitionBy('Recipe_name').orderBy('order')
df.withColumn('Cycle',when(col('Metric') < lag('Metric',1,0).over(w),1).otherwise(0)) \
.withColumn('Cycle',sum('Cycle').over(w)) \
.orderBy('order') \
.show()
+------+-----------+-----+
|Metric|Recipe_name|Cycle|
+------+-----------+-----+
| 100| A| 0|
| 200| A| 0|
| 300| A| 0|
| 10| A| 1|
| 20| A| 1|
| 10| B| 0|
| 20| B| 0|
| 10| A| 2|
| 20| A| 2|
| 10| B| 1|
+------+-----------+-----+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。