在熊猫中,我希望根据另一列“ A”中的布尔值在一个列“ B”中添加一个值。因此,如果“ A”为True,则只要“ A”为false,就开始计数(即每行增加一个)。当“ A”为真时,重置并重新开始计数。我设法通过“ for”循环来做到这一点,但这非常耗时。我想知道是否没有其他省时的解决方案?

结果应如下所示:

Date     A      B
01.2010 False   0
02.2010 True    1
03.2010 False   2
04.2010 False   3
05.2010 True    1
06.2010 False   2

最佳答案

您可以将cumsumgroupbycumcount结合使用:

print df
    Date      A
0  1.201  False
1  1.201   True
2  1.201  False
3  2.201   True
4  3.201  False
5  4.201  False
6  5.201   True
7  6.201  False
roll = df.A.cumsum()
print roll
0    0
1    1
2    1
3    2
4    2
5    2
6    3
7    3
Name: A, dtype: int32

df['B'] = df.groupby(roll).cumcount() + 1
#if in first values are False, output is 0
df.loc[roll == 0 , 'B'] = 0
print df
    Date      A  B
0  1.201  False  0
1  1.201   True  1
2  1.201  False  2
3  2.201   True  1
4  3.201  False  2
5  4.201  False  3
6  5.201   True  1
7  6.201  False  2

10-07 13:28