Python 基于其他多个条件获取列值

Python 基于其他多个条件获取列值,python,pandas,Python,Pandas,我有一个数据帧: 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

我有一个数据帧:

 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

首先,定义一个映射字典,将1…n映射到所需的填充值;下面是一个小例子:

dct = {1: 'aa', 2: 'bb', 3: 'cc'}
然后使用groupby、cumsum和map

df.groupby('cid').si.cumsum().map(dct)

这里的重要部分是cumsum,因为这就是我们如何知道一个新的团队正在开始的原因:

df.groupby('cid').si.cumsum()


为什么它以aa开头?我们从何处获取这些值?最可能的词语选择不当,增加这些值的规则是什么?从a到z再回到a?这基本上是一个标识符,即“1”一出现,新的“a”系列就开始了。它可以是任何东西,所以它不必是aa,bb,cc,等等?只有一个柜台吗?是的。但是应该保持不变直到下一次发生谢谢。这很有帮助
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