使用一列值为可变序号列创建计数器

Using a column of values to create a counter for a variable sequential number column

我目前有一个包含一些列的 pandas 数据框。我希望建立一个专栏,Sequential,它列出了在循环的那个部分记录的迭代。我目前正在使用 itertools.cycle 和固定次数的迭代 block_cycles 进行此操作,如下所示:

# Fill out Sequential Numbers
block_cycles = 330
lens = len(raw_data.index)
sequential = list(itertools.islice(itertools.cycle(range(1, block_cycles)),lens))
interim_output['Sequential'] = sequential

输出如下:

print(interim_output['Sequential'])

0    1
1    2
2    3
...
329  330
331  1
332  2
332  3

如果一个循环中的迭代次数相同,这就可以了。然而,经过调查,我发现并不是每个循环都包含相同数量的迭代。我还有另一列 CycleNumber,其中包含迭代所属的循环编号。它看起来像这样:

print(raw_data['CycleNumber'])

0           1
1           1
2           1
3           1
4           1

51790    4936
51791    4936
51792    4936
51793    4936
51794    4936

因此,例如,一个循环可能包含 330 次迭代,而另一个循环可能包含 333、331 等等 - 不能保证它们是相同的。循环数中的值递增。

我已经建立了每个循环包含的迭代量的字典,cycle_freq,它看起来像这样:


# Calculate the number of iterations each cycle contains
cycle_freq = {}
for item in cycle_number:
    if (item in cycle_freq):
        cycle_freq[item] += 1
    else:
        cycle_freq[item] = 1

print (cycle_freq)

{1: 330, 2: 332, 3: 331, 4: 332, 5: 332, 6: 333, 7: 333, 8: 330....
4933: 331, 4934: 334, 4935: 287, 4936: 24}

我怎样才能使用这个字典来替换常量变量 block_cycles,根据该循环中确切的迭代次数创建一个大的序列号列列表?到目前为止,这是我试图让它使用字典 cycle_freq 中包含的值的逻辑,但无济于事:

for i in cycle_freq:
    iteration = list(itertools.islice(itertools.cycle(range(1, cycle_freq[i])),lens))
    sequential.append(iteration)

我想要的输出如下所示:

0    1
1    2
3    3
...
329  330
330  1
332  2
...
661  332
662  1
663  2

如有任何帮助,我们将不胜感激!

我使用了一个解决方法并放弃了 itertools:

sequential = []
for _, cycles in cycle_freq.items():
    seq = [cycle for cycle in range(1, cycles + 1)]
    sequential.extend(seq)

interim_output['Sequential'] = sequential