我有一个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发生,那么我不感兴趣。
答案 0 :(得分: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|
+---+-----+