pandas 数据帧上的循环导致性能下降 - 可以使用滚动吗?
For loop on pandas dataframe causing slow performance - can rolling be used?
我目前在脚本中有一个循环,旨在处理原始测试数据文件,并在清理数据期间执行一系列计算。在脚本中,我需要弄清楚每个测试中到底有多少个周期。当包含位置 i
的 step
值大于下一个 step
、i+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
来做max
和min
比较,但是可以用它来代替这个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
累计计算这些次数。
我目前在脚本中有一个循环,旨在处理原始测试数据文件,并在清理数据期间执行一系列计算。在脚本中,我需要弄清楚每个测试中到底有多少个周期。当包含位置 i
的 step
值大于下一个 step
、i+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
来做max
和min
比较,但是可以用它来代替这个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
累计计算这些次数。