我有一个dataframe
像下面提供:
+-------+--------------+----+-------------+
|recType|registerNumber|mnId| sequence|
+-------+--------------+----+-------------+
| 01| 13578000| 0| 1|
| 11| 13578000| 1| 1|
| 13| 13578000| 2| 1|
| 14| 13578000| 3| 1|
| 14| 13578000| 4| 1|
| 01| 11121000| 5| 2|
| 11| 11121000| 6| 2|
| 13| 11121000| 7| 2|
| 14| 11121000| 8| 2|
| 01| OC387000| 9| 3|
| 11| OC387000| 10| 3|
| 13| OC387000| 11| 3|
| 01| 11121000| 12| 4|
| 11| 11121000| 13| 4|
| 13| 11121000| 14| 4|
| 14| 11121000| 15| 4|
| 11| OC321000| 16| 4|
| 13| OC321000| 17| 4|
| 01| OC322000| 18| 5|
| 11| OC322000| 19| 5|
| 13| OC322000| 20| 5|
| 11| SO352000| 21| 5|
| 13| SO352000| 22| 5|
+-------+--------------+----+-------------+
如果您注意到这里,sequence
4和5有多个registerNumber
。这是因为某些记录集没有recType
01
。记录集通常以recType
01
开头。
以OC3
开始的registerNumber
,SO3
可能有也可能没有recType
01
。因此,sequence
列将它们视为前一记录集的一部分。
我想确认一下,如果两个registerNumbers
位于同一个sequence
下,并且registerNumber
以OC3
或SO3
开头,则应该为它们分配一个新的Sequence
值,该值应为max(sequence)+1
。
因此,结果dataframe
应如下所示:
+-------+--------------+----+-------------+
|recType|registerNumber|mnId| sequence|
+-------+--------------+----+-------------+
| 01| 13578000| 0| 1|
| 11| 13578000| 1| 1|
| 13| 13578000| 2| 1|
| 14| 13578000| 3| 1|
| 14| 13578000| 4| 1|
| 01| 11121000| 5| 2|
| 11| 11121000| 6| 2|
| 13| 11121000| 7| 2|
| 14| 11121000| 8| 2|
| 01| OC387000| 9| 3|
| 11| OC387000| 10| 3|
| 13| OC387000| 11| 3|
| 01| 11121000| 12| 4|
| 11| 11121000| 13| 4|
| 13| 11121000| 14| 4|
| 14| 11121000| 15| 4|
| 11| OC321000| 16| 6|
| 13| OC321000| 17| 6|
| 01| OC322000| 18| 5|
| 11| OC322000| 19| 5|
| 13| OC322000| 20| 5|
| 11| SO352000| 21| 7|
| 13| SO352000| 22| 7|
+-------+--------------+----+-------------+
谢谢大家的支持。
1条答案
按热度按时间pftdvrlh1#
让我们使用collect_set函数来获取sequence内的一组寄存器,并使用它来派生“sequence内的sequence”列,该列随寄存器更改而更改。
从这里
sequence
+seqInSeq
直接确定组,使用dense_rank对它们重新编号是相当容易的,我们只需要小心排序-我们不是从头开始编号,而是为seqInSeq > 1
的行添加额外的序列号。