С рейтингом dense
в обоих concat
первый кадр на втором и затем сортировка. Это гарантирует, что строка в df2
появится над строкой с аналогичным рейтингом в df1
. Тогда новый рейтинг cumcount
в группе
df = pd.concat([df2, df1], ignore_index=True).sort_values(['cust_id', 'rank'])
df['rank'] = df.groupby('cust_id').cumcount()+1
cust_id rank opt
0 customer_1 1 new_opt
3 customer_1 2 test1
4 customer_1 3 test3
5 customer_1 4 test4
6 customer_2 1 test1
1 customer_2 2 new_opt
7 customer_2 3 test4
8 customer_2 4 test3
9 customer_3 1 test3
10 customer_3 2 test4
2 customer_3 3 new_opt
11 customer_3 4 test1
Если вместо этого вы обычно хотите добавить 1
к рейтингу для всех строк с рангом вышеnew_opt
, независимо от начального ранга, мы можем сделать это с groupby.apply
. Тот же первый шаг, но теперь мы используем cummax
, чтобы добавить 1 ко всем строкам в группе после new_opt
. Это приводит к тому же результату, что и выше.
df = pd.concat([df2, df1], ignore_index=True).sort_values(['cust_id', 'rank'])
df['rank'] = (df['rank']
+ (df.opt.eq('new_opt')
.groupby(df.cust_id)
.apply(lambda x: x.shift().cummax()).fillna(0).astype(int)))