Новый столбец с номером пробега в пандах, условно

Вопрос:

Учитывая данные с данными, такими как:

>>> df
 data
0 START
1 blah
2 blah
3 blah
4 blah
5 END
6 START
7 blah
8 blah
9 END

Каков наиболее эффективный способ присвоить новый столбец рабочим числом, которое увеличивается с каждым START? Это мой желаемый результат:

>>> df
 data number
0 START 1
1 blah 1
2 blah 1
3 blah 1
4 blah 1
5 END 1
6 START 2
7 blah 2
8 blah 2
9 END 2

Что я наделал

Это работает отлично, но довольно медленно (это будет применяться к гораздо большему фреймворку данных, и я уверен, что есть лучший способ сделать это:

counter = 0
df = df.assign(number = 0)
for i, row in df.iterrows():
 if row['data'] == 'START':
 counter += 1
 df.loc[i, 'number'] = counter

Воспроизведение примерного кадра данных

import pandas as pd
data = ['blah'] * 10
data[0], data[6] = ['START'] * 2
data[5], data[-1] = ['END'] * 2

df = pd.DataFrame({'data':data})
1 ответ

Вот один из способов

df.data.eq('START').cumsum()
Out[74]: 
0 1
1 1
2 1
3 1
4 1
5 1
6 2
7 2
8 2
9 2
Name: data, dtype: int32

После назначения его обратно

df['number']=df.data.eq('START').cumsum()
df
Out[76]: 
 data number
0 START 1
1 blah 1
2 blah 1
3 blah 1
4 blah 1
5 END 1
6 START 2
7 blah 2
8 blah 2
9 END 2

licensed under cc by-sa 3.0 with attribution.