pandas 数据帧上的循环导致性能下降 - 可以使用滚动吗?

For loop on pandas dataframe causing slow performance - can rolling be used?

我目前在脚本中有一个循环,旨在处理原始测试数据文件,并在清理数据期间执行一系列计算。在脚本中,我需要弄清楚每个测试中到底有多少个周期。当包含位置 istep 值大于下一个 stepi+1 时,可以定义一个循环。例如,步数达到4,下一步是1,那么下一步就是新循环的开始。到目前为止,我正在用这个简单的循环计算这个:

raw_data = {'Step':[1,1,2,2,2,3,3,4,4,4,1,2,2,3,3,3,4,4,4,4,1,2,2,3,3,4,4,4]}


cycle_test = 1


for i in range(len(raw_data)-1):
    if  raw_data['Step'][i] > raw_data['Step'][i+1]:
        raw_data['CyclesTest'][i] = cycle_test
        cycle_test+=1
    else:
        raw_data['CyclesTest'][i] = cycle_test

这很好用,但是提供的 raw_data 非常大,而且我的脚本一直在计算这个。我以前用过rolling来做maxmin比较,但是可以用它来代替这个for循环吗?我刚刚重新开始编程,所以每天都是上学日!任何帮助将不胜感激。

你可以这样做:

import pandas as pd

raw_data = {'Step':[1,1,2,2,2,3,3,4,4,4,1,2,2,3,3,3,4,4,4,4,1,2,2,3,3,4,4,4]}

df = pd.DataFrame(raw_data)
df['CycleTest'] = (df['Step'].diff() < 0).cumsum() + 1

print(df)
    Step  CycleTest
0      1          1
1      1          1
2      2          1
3      2          1
4      2          1
5      3          1
6      3          1
7      4          1
8      4          1
9      4          1
10     1          2
11     2          2
12     2          2
13     3          2
14     3          2
15     3          2
16     4          2
17     4          2
18     4          2
19     4          2
20     1          3
21     2          3
22     2          3
23     3          3
24     3          3
25     4          3
26     4          3
27     4          3

使用 diff 检查值何时变小,并使用 cumsum 累计计算这些次数。