我有一个数据框:
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中的下一个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
答案 0 :(得分:1)
首先,定义一个映射字典,该映射将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