如果在 pyspark 数据帧中后跟连续 5 个“0”,则按条件获取第一个“1”

Get the first '1's on condition if it followed by consecutive 5 '0's in pyspark dataframe

我有一个 pyspark 数据框,它在 user_id 上每个月的事件列分别为 0 和 1。我需要 select 将事件设置为 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 则我不感兴趣。

我不知道你想在这里达到什么目的,但是通过提供的输入数据,你可以获得一个事件的补码,然后找到当前行之前 5 行的 window 的累计和。 检查这个并告诉我,

>>> 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|
+---+-----+