Python 新列的运行编号以熊猫为单位,按条件递增

Python 新列的运行编号以熊猫为单位,按条件递增,python,pandas,dataframe,Python,Pandas,Dataframe,问题: 给定包含以下数据的数据帧: >>> df data 0 START 1 blah 2 blah 3 blah 4 blah 5 END 6 START 7 blah 8 blah 9 END 分配一个新列的最有效方法是什么?该列的运行编号在每次开始时递增?这是我想要的结果: >>> df data number 0 START 1 1 blah 1 2 bla

问题:

给定包含以下数据的数据帧:

>>> df
    data
0  START
1   blah
2   blah
3   blah
4   blah
5    END
6  START
7   blah
8   blah
9    END
分配一个新列的最有效方法是什么?该列的运行编号在每次
开始时递增?这是我想要的结果:

>>> 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
我所做的

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

df = pd.DataFrame({'data':data})
这很好,但速度相当慢(这将应用于更大的数据帧,我相信有更好的方法:

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})
这里有一条路

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
这将有助于: