我有一个数据帧:
cid si
A 1
A 0
A 1
A 0
A 1
A 0
A 0
A 0
A 0
A 0
A 0
A 0
A 0
A 0
B 1
B 0
B 0
B 0
B 0
B 0
B 0
我需要有另一个名为ide的列,它应该添加相同的值,直到遇到si中的next 1并且cid中的值保持不变。如果cid中的值被更改,则标识符将重新开始。添加样本输出。
cid si ide
A 1 aa
A 0 aa
A 1 bb
A 0 bb
A 1 cc
A 0 cc
A 0 cc
A 0 cc
A 0 cc
A 0 cc
A 0 cc
A 0 cc
A 0 cc
A 0 cc
B 1 aa
B 0 aa
B 0 aa
B 0 aa
B 0 aa
B 0 aa
B 0 aa
首先,定义一个映射字典,将1 ... n映射到您想要的填充值;这是一个小例子:
dct = {1: 'aa', 2: 'bb', 3: 'cc'}
然后使用groupby
,cumsum
和map
:
df.groupby('cid').si.cumsum().map(dct)
0 aa
1 aa
2 bb
3 bb
4 cc
5 cc
6 cc
7 cc
8 cc
9 cc
10 cc
11 cc
12 cc
13 cc
14 aa
15 aa
16 aa
17 aa
18 aa
19 aa
20 aa
Name: si, dtype: object
这里的重要部分是cumsum
,因为我们知道一个新的团队正在开始:
df.groupby('cid').si.cumsum()
0 1
1 1
2 2
3 2
4 3
5 3
6 3
7 3
8 3
9 3
10 3
11 3
12 3
13 3
14 1
15 1
16 1
17 1
18 1
19 1
20 1
Name: si, dtype: int64