вам нужно сгруппировать 1-ю группу по параметру и per и присвоить уникальное значение по одному групперу. Затем снова группируйте по параметрам и группировщикам и сортируйте каждую группу по параметрам и по
import pandas as pd
from pandas import Timestamp
df = pd.DataFrame([['XYZ', 1.0, Timestamp('2018-10-01 00:00:00'), 11.0], ['XYZ', 2.0, Timestamp('2017-08-01 00:00:00'), 15.25], ['XYZ', 1.0, Timestamp('2019-10-01 00:00:00'), 11.25], ['XYZ', 2.0, Timestamp('2019-08-01 00:00:00'), 15.71], ['MMG', 1.0, Timestamp('2021-10-01 00:00:00'), 12.5], ['MMG', 2.0, Timestamp('2021-10-01 00:00:00'), 11.75], ['ZZZ', 4.0, Timestamp('2023-01-01 00:00:00'), 19.0], ['ZZZ', 3.0, Timestamp('2014-01-01 00:00:00'), 13.0], ['MMM', 1.0, Timestamp('2016-03-01 00:00:00'), 12.01], ['MMM', 2.0, Timestamp('2019-01-01 00:00:00'), 16.0], ['ZZZ', 1.0, Timestamp('2009-06-01 00:00:00'), 12.5], ['ZZZ', 2.0, Timestamp('2018-01-01 00:00:00'), 19.0]], columns=('param', 'per', 'per_date', 'per_num'))
df["grouper"] = df.groupby(["param", "per"]).cumcount()
df.groupby(["param", "grouper"])\
.apply(lambda g: g.sort_values(["param", "per"]))\
.reset_index(drop=True)
Результат
param per per_date per_num grouper
0 MMG 1.0 2021-10-01 12.50 0
1 MMG 2.0 2021-10-01 11.75 0
2 MMM 1.0 2016-03-01 12.01 0
3 MMM 2.0 2019-01-01 16.00 0
4 XYZ 1.0 2018-10-01 11.00 0
5 XYZ 2.0 2017-08-01 15.25 0
6 XYZ 1.0 2019-10-01 11.25 1
7 XYZ 2.0 2019-08-01 15.71 1
8 ZZZ 1.0 2009-06-01 12.50 0
9 ZZZ 2.0 2018-01-01 19.00 0
10 ZZZ 3.0 2014-01-01 13.00 0
11 ZZZ 4.0 2023-01-01 19.00 0