Pandas: conditional rolling count Pandas: conditional rolling count python python

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


One-liner:

df['count'] = df.groupby('col').cumcount()

or

df['count'] = df.groupby('col').cumcount() + 1

if you want the counts to begin at 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