我正在编写一个代码,其中我需要根据A列和B列的分组添加序列号.下面是我拥有的表/数据框.数据按可乐日期排序.

colA colB Date
A 1 01-01-2014
A 1 01-02-2014
A 3 30-04-2014
A 3 05-05-2014
A 2 25-05-2014
A 1 06-06-2014
A 1 21-07-2014
B 1 04-09-2014
B 1 19-10-2014
B 1 03-12-2014
C 3 17-01-2015
C 2 03-03-2015
C 2 17-04-2015

以下是预期结果:

colA colB Date ROWNUM
A 1 01-01-2014 1
A 1 01-02-2014 2
A 3 30-04-2014 1
A 3 05-05-2014 2
A 2 25-05-2014 1
A 1 06-06-2014 1
A 1 21-07-2014 2
B 1 04-09-2014 1
B 1 19-10-2014 2
B 1 03-12-2014 3
C 3 17-01-2015 1
C 2 03-03-2015 1
C 2 17-04-2015 2

我在这里try 使用ROW_NUMBER,并获得以下结果,其中对于A(可乐),下一个出现的1(Colb)将ROW_NUMBER添加为3而不是1:

colA colB Date ROWNUM
A 1 01-01-2014 1
A 1 01-02-2014 2
A 3 30-04-2014 1
A 3 05-05-2014 2
A 2 25-05-2014 1
A 1 06-06-2014 3
A 1 21-07-2014 4
B 1 04-09-2014 1
B 1 19-10-2014 2
B 1 03-12-2014 3
C 3 17-01-2015 1
C 2 03-03-2015 1
C 2 17-04-2015 2

推荐答案

这将会奏效:

w=Window.orderBy(F.asc("colA"), F.asc("Date"))

df\
.withColumn("eq", F.when(F.lag("colB").over(w)==F.col("colB"), 0).otherwise(1))\
.withColumn("groups", F.sum("eq").over(w))\
.withColumn("row_num", F.row_number().over(w.partitionBy(F.col("colA"), F.col("groups"))))\
.show()

多亏了这个答案:Window functions: PARTITION BY one column after ORDER BY another

输入:

+----+----+----------+
|colA|colB|      Date|
+----+----+----------+
|   A|   1|2014-01-01|
|   A|   1|2014-02-01|
|   A|   3|2014-04-30|
|   A|   3|2014-05-05|
|   A|   2|2014-05-25|
|   A|   1|2014-06-06|
|   A|   1|2014-07-21|
|   B|   1|2014-09-04|
|   B|   1|2014-10-19|
|   B|   1|2014-12-03|
|   C|   3|2015-01-17|
|   C|   2|2015-03-03|
|   C|   2|2015-04-17|
+----+----+----------+

输出(保留中间列以便于理解,您可以删除它们):

+----+----+----------+---+------+-------+
|colA|colB|      Date| eq|groups|row_num|
+----+----+----------+---+------+-------+
|   A|   1|2014-01-01|  1|     1|      1|
|   A|   1|2014-02-01|  0|     1|      2|
|   A|   3|2014-04-30|  1|     2|      1|
|   A|   3|2014-05-05|  0|     2|      2|
|   A|   2|2014-05-25|  1|     3|      1|
|   A|   1|2014-06-06|  1|     4|      1|
|   A|   1|2014-07-21|  0|     4|      2|
|   B|   1|2014-09-04|  0|     4|      1|
|   B|   1|2014-10-19|  0|     4|      2|
|   B|   1|2014-12-03|  0|     4|      3|
|   C|   3|2015-01-17|  1|     5|      1|
|   C|   2|2015-03-03|  1|     6|      1|
|   C|   2|2015-04-17|  0|     6|      2|
+----+----+----------+---+------+-------+

Python相关问答推荐

如何在Pandas 中存储二进制数?

为什么使用SciPy中的Distance. cos函数比直接执行其Python代码更快?

我可以使用极点优化这个面向cpu的pandas代码吗?

将列表中的元素替换为收件箱中的元素

Python如何让代码在一个程序中工作而不在其他程序中工作

Docker-compose:为不同项目创建相同的容器

两极:如何分割一个大 pyramid 并并行保存每个

如何处理必须存在于环境中但无法安装的Python项目依赖项?

使用numpy提取数据块

根据二元组列表在pandas中创建新列

关于Python异步编程的问题和使用await/await def关键字

实现自定义QWidgets作为QTimeEdit的弹出窗口

如何在图中标记平均点?

Python导入某些库时非法指令(核心转储)(beautifulsoup4."" yfinance)

在极中解析带有数字和SI前缀的字符串

python panda ExcelWriter切换动态公式到数组公式

如何创建引用列表并分配值的Systemrame列

如何按row_id/row_number过滤数据帧

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量