问题:
给定一个包含如下数据的数据框:
>>> 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})
答案 0 :(得分:5)
这是一种方式
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