如果在pyspark数据帧中后续连续5'0,则获得第一个'1'条件

问题描述 投票:0回答:1

我有一个pyspark数据框,在user_id上每个月的事件列为0和1。我需要选择1的事件,它必须具有完全透明的行为5 0。如果这个条件满足那么只得到第一个1?实际上确定了5 0和下1的模式

我尝试使用排名,但它不适合我的整个数据集。任何输入都会有所帮助。

例如。如果你有数据帧:

 df:
 user_id   event
   1         0   
   1         0
   1         0
   1         0
   1         0
   1         1

现在我需要在我的数据集中找到这种模式,它可以在我的位置获得我的具有特定用户ID的数据集的记录。至于用户ID,我可以有最多48条记录,我需要找到这样的模式组。在这之间如果1发生那么我不感兴趣。

python pandas pyspark spark-dataframe pyspark-sql
1个回答
1
投票

我不知道你想在这里实现什么,但是通过提供的输入数据,你可以获得一个事件的补充,然后在当前行之前的5行窗口中找到累积和。检查一下,让我知道,

>>> df.show()
+---+-----+
| id|event|
+---+-----+
|  1|    0|
|  1|    0|
|  1|    0|
|  1|    0|
|  1|    0|
|  1|    1|
|  1|    1|
|  1|    1|
|  2|    1|
|  2|    0|
|  2|    0|
|  2|    0|
|  2|    0|
|  2|    0|
|  2|    1|
+---+-----+

>>> df = df.withColumn('r_event',F.when(df.event == 0,1).otherwise(0))
>>> w = Window.partitionBy('id').orderBy('id').rowsBetween(-5,-1)
>>> df = df.withColumn('c_sum',F.sum('r_event').over(w))
>>> df.show()
+---+-----+-------+-----+
| id|event|r_event|c_sum|
+---+-----+-------+-----+
|  1|    0|      1| null|
|  1|    0|      1|    1|
|  1|    0|      1|    2|
|  1|    0|      1|    3|
|  1|    0|      1|    4|
|  1|    1|      0|    5|
|  1|    1|      0|    4|
|  1|    1|      0|    3|
|  2|    1|      0| null|
|  2|    0|      1|    0|
|  2|    0|      1|    1|
|  2|    0|      1|    2|
|  2|    0|      1|    3|
|  2|    0|      1|    4|
|  2|    1|      0|    5|
+---+-----+-------+-----+

>>> df.where(df.c_sum == 5).select('id','event').show()
+---+-----+
| id|event|
+---+-----+
|  1|    1|
|  2|    1|
+---+-----+ 
© www.soinside.com 2019 - 2024. All rights reserved.