Use GroupBy.cumcount
with ascending=False
for counter in descending order and pivoting by 4 columns, then use rename
- add keys to dictionary for rename if 3 or 4 duplicated decisions:
df = (df.assign(g = df.groupby(['id','date']).cumcount(ascending=False))
.pivot(['id','date'], 'g', 'decision')
.reindex(columns=range(4))
.fillna(0)
.rename(columns={0:'CR',1:'Principal',2:'final',3:'post final'})
.rename_axis(columns=None)
.reset_index())
print (df)
id date CR Principal final post final
0 1 2022-11-10 checked improve 0.0 0.0
1 2 2021-09-12 checked 0 0.0 0.0
2 3 2020-08-22 checked 0 0.0 0.0
3 4 2019-11-10 revise complete 0.0 0.0