# Pandas, count of frequency till value changes

• A+
Category：Languages

imagine that i have following dataframe

``df = pd.DataFrame([10, 10, 23, 23, 9, 9, 9, 10, 10, 10, 10, 12],columns=['values']) ``

I want to calculate frequency of uniqe values, but not overall count. count of values till it changes to other value. i tried

`df['values'].value_counts()`

but it gives me

`10 6 9 3 23 2 12 1 ` But desired output is

``10:2  23 :2 9 : 3 10: 4 12:1 ``

How can i do this? Thanks for your help!

Use:

``df = df.groupby(df['values'].ne(df['values'].shift()).cumsum())['values'].value_counts() ``

Or:

``df = df.groupby([df['values'].ne(df['values'].shift()).cumsum(), 'values']).size() ``

``print (df) values  values 1       10        2 2       23        2 3       9         3 4       10        4 5       12        1 Name: values, dtype: int64 ``

Last for remove first level:

``df = df.reset_index(level=0, drop=True) print (df) values 10    2 23    2 9     3 10    4 12    1 dtype: int64 ``

Explanation:

Compare original column by `shift`ed with not equal `ne` and then add `cumsum` for helper `Series`:

``print (pd.concat([df['values'], a, b, c],                   keys=('orig','shifted', 'not_equal', 'cumsum'), axis=1))     orig  shifted  not_equal  cumsum 0     10      NaN       True       1 1     10     10.0      False       1 2     23     10.0       True       2 3     23     23.0      False       2 4      9     23.0       True       3 5      9      9.0      False       3 6      9      9.0      False       3 7     10      9.0       True       4 8     10     10.0      False       4 9     10     10.0      False       4 10    10     10.0      False       4 11    12     10.0       True       5 ``