基于列条件的 Pyspark 计数器

发布于 2025-01-10 01:41:29 字数 1403 浏览 0 评论 0原文

您好,我想根据 Tag1 列的条件创建一个带有计数器的新列。

我有这个:

TimeTag1
10
21
31
41
50
60
71
81
91
101
110
120

我想要这样:

TimeTag1Counter
100
211
312
413
500
600
711
812
913
1014
1100
1200

我尝试使用 function.when(df.Tag1 == 1, function.lag(df.Tag1)+1).otherwise(0) 但不起作用。

有什么想法吗?

多谢

Hello I would like to create a new column with a counter based on the condition of Tag1 column.

I have this:

TimeTag1
10
21
31
41
50
60
71
81
91
101
110
120

And I would like this:

TimeTag1Counter
100
211
312
413
500
600
711
812
913
1014
1100
1200

I tried with function.when(df.Tag1 == 1, function.lag(df.Tag1)+1).otherwise(0) but doesn't work.

Any idea?

Thanks a lot

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忆离笙 2025-01-17 01:41:29

窗函数

    new = (df.withColumn('Counter',(col('Tag1')=='0'))#Create Bool
       .withColumn('Counter', F.sum(F.col('Counter').cast('integer')).over(Window.partitionBy().orderBy().rowsBetween(-sys.maxsize, 0)))# Create Group by summing bool
.withColumn('Counter', when(col('Tag1')==0, col('Tag1')).otherwise(F.sum('Tag1').over(Window.partitionBy('Counter').orderBy().rowsBetween(-sys.maxsize, 0))))#Conditionally add
       
      )

new.show()

+----+----+-------+
|Time|Tag1|Counter|
+----+----+-------+
|   1|   0|      0|
|   2|   1|      1|
|   3|   1|      2|
|   4|   1|      3|
|   5|   0|      0|
|   6|   0|      0|
|   7|   1|      1|
|   8|   1|      2|
|   9|   1|      3|
|  10|   1|      4|
|  11|   0|      0|
|  12|   0|      0|
+----+----+-------+

Window function

    new = (df.withColumn('Counter',(col('Tag1')=='0'))#Create Bool
       .withColumn('Counter', F.sum(F.col('Counter').cast('integer')).over(Window.partitionBy().orderBy().rowsBetween(-sys.maxsize, 0)))# Create Group by summing bool
.withColumn('Counter', when(col('Tag1')==0, col('Tag1')).otherwise(F.sum('Tag1').over(Window.partitionBy('Counter').orderBy().rowsBetween(-sys.maxsize, 0))))#Conditionally add
       
      )

new.show()

+----+----+-------+
|Time|Tag1|Counter|
+----+----+-------+
|   1|   0|      0|
|   2|   1|      1|
|   3|   1|      2|
|   4|   1|      3|
|   5|   0|      0|
|   6|   0|      0|
|   7|   1|      1|
|   8|   1|      2|
|   9|   1|      3|
|  10|   1|      4|
|  11|   0|      0|
|  12|   0|      0|
+----+----+-------+
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文