Skip to content Skip to sidebar Skip to footer

Streaks Of True Or False In Pandas Series

I'm trying to work out how to show streaks of True or False in a pandas Series. Data: p = pd.Series([True,False,True,True,True,True,False,False,True]) 0 True 1 False 2

Solution 1:

You can use cumcount of consecutives groups created by compare if p is not equal with shifted p and cumsum:

print (p.ne(p.shift()))
0     True
1     True
2     True
3    False
4    False
5    False
6     True
7    False
8     True
dtype: bool

print (p.ne(p.shift()).cumsum())
0    1
1    2
2    3
3    3
4    3
5    3
6    4
7    4
8    5
dtype: int32

print (p.groupby(p.ne(p.shift()).cumsum()).cumcount())
0    0
1    0
2    0
3    1
4    2
5    3
6    0
7    1
8    0
dtype: int64

Thank you MaxU for another solution:

print (p.groupby(p.diff().cumsum()).cumcount())
0    0
1    0
2    0
3    1
4    2
5    3
6    0
7    1
8    0
dtype: int64 

Solution 2:

Another alternative solution is create the cumulative sum of p Series and subtract the most recent cumulative sum where p is 0. Then invert p and do same. Last multiple Series together:

c = p.cumsum()
a = c.sub(c.mask(p).ffill(), fill_value=0).sub(1).abs()
c = (~p).cumsum()
d = c.sub(c.mask(~(p)).ffill(), fill_value=0).sub(1).abs()

print (a)
0    0.0
1    1.0
2    0.0
3    1.0
4    2.0
5    3.0
6    1.0
7    1.0
8    0.0
dtype: float64

print (d)
0    1.0
1    0.0
2    1.0
3    1.0
4    1.0
5    1.0
6    0.0
7    1.0
8    1.0
dtype: float64
print (a.mul(d).astype(int))
0    0
1    0
2    0
3    1
4    2
5    3
6    0
7    1
8    0
dtype: int32

Post a Comment for "Streaks Of True Or False In Pandas Series"