Reversing the counting direction of a counter

Question:

I’m trying to reverse the counter of the following count but I don’t know how to do it.

My dataframe looks like this (adf):

Visit – ID Pos(int) Title(str)
randomnumber1 1 rstring
randomnumber1 2 rstring
randomnumber2 1 rstring
randomnumber2 2 rstring
randomnumber2 3 rstring

My code looks like the following:

bdf = (adf.assign(col=adf.groupby('Visit - ID').cumcount()+1)
   .set_index(['Visit - ID','col'])
   .unstack('col')
   .sort_index(level=(1,0), axis=1)
)

bdf.columns = [f'{x}{y}' for x,y in bdf.columns]

Output:

Visit – ID Pos 1 Pos 2 Pos 3
randomnumber1 2 1 NaN
randomnumber2 3 2 1
randomnumber3 3 2 1
randomnumber4 3 2 1
randomnumber5 3 2 1

So the counting is reverse. How do I correct the ‘counting direction’ so that it looks like the following?

Visit – ID Col 1 Col 2 Col 3
randomnumber1 1 2 3
randomnumber2 1 2 3
randomnumber3 1 2 3
randomnumber4 1 2 3
randomnumber5 1 2 3
Asked By: Lazarus

||

Answers:

You can use cumcount(ascending=False):

import pandas as pd

df = pd.DataFrame({
    'id': [1, 1, 2, 2, 2]
})

df['cc_asc'] = df.groupby('id').cumcount(ascending=True)
df['cc_desc'] = df.groupby('id').cumcount(ascending=False)

df
#    id  cc_asc  cc_desc
# 0   1       0        1
# 1   1       1        0
# 2   2       0        2
# 3   2       1        1
# 4   2       2        0
Answered By: Nils Werner
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.