如果在 pyspark 数据帧中后跟连续 5 个“0”,则在条件下获取第一个“1”
Posted
技术标签:
【中文标题】如果在 pyspark 数据帧中后跟连续 5 个“0”,则在条件下获取第一个“1”【英文标题】:Get the first '1's on condition if it followed by consecutive 5 '0's in pyspark dataframe 【发布时间】:2018-03-05 16:16:58 【问题描述】:我有一个 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,那么我不感兴趣。
【问题讨论】:
【参考方案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|
+---+-----+
【讨论】:
很高兴知道!!以上是关于如果在 pyspark 数据帧中后跟连续 5 个“0”,则在条件下获取第一个“1”的主要内容,如果未能解决你的问题,请参考以下文章
编写一个python函数在pyspark数据帧中自动执行数据标记
如果 pyspark 数据帧的行基于两列的值位于另一个数据帧中,如何删除它们?