Pandas: conditional rolling count
I think there is a nice way to combine the solution of @chrisb and @CodeShaman (As it was pointed out CodeShamans solution counts total and not consecutive values).
df['count'] = df.groupby((df['col'] != df['col'].shift(1)).cumsum()).cumcount()+1 col count0 B 11 B 22 A 13 A 24 A 35 B 1
Based on the second answer you linked, assuming s
is your series.
df = pd.DataFrame(s)df['block'] = (df['col'] != df['col'].shift(1)).astype(int).cumsum()df['count'] = df.groupby('block').transform(lambda x: range(1, len(x) + 1))In [88]: dfOut[88]: col block count0 B 1 11 B 1 22 A 2 13 A 2 24 A 2 35 B 3 1