Уравнивание пользователей в одном датасете по значениям из другого Python (Pandas)
У меня есть 2 датасета (для примера взял минимальный набор):
dict1 = [{'user_id': 100, 'bonus': 1},{'user_id': 101, 'bonus': 3}, {'user_id': 102, 'bonus': 1}]
df1 = pd.DataFrame(dict1)
df1.head()
user_id bonus
0 100 1
1 101 3
2 102 1
dict2 = query1 = [{'LVL': 'LVL1', 'user_id': 100},{'LVL': 'LVL2', 'user_id': 101}, {'LVL': 'LVL3', 'user_id': 101}, {'LVL': 'LVL4', 'user_id': 101},{'LVL': 'LVL5', 'user_id': 102}]
df2 = pd.DataFrame(dict2)
df2.head()
LVL user_id
0 LVL1 100
1 LVL2 101
2 LVL3 101
3 LVL4 101
4 LVL5 102
df1 - уникальные пользователи и количество бонусов у них
df2 - уровни для пользователей (уникальные) и пользователи на них.
Мне необходимо написать функцию или просто обработку, которая перераспределяла бы количество bonus из df1 равномерно между user_id в таблицу df2, т.е. если у одного user_id количество bonus в df1 составляет 3 (как у user_id = 101) то для ближайшего LVL (с этим user_id) в датасете df2 должен присвоиться user_id с наименьшим количеством бонусов. То есть на выходе я должен получить:
LVL user_id
0 LVL1 100
1 LVL2 100
2 LVL3 101
3 LVL4 101
4 LVL5 102
Т.е. я уравниваю количество LVL на одного уникального user_id в датасете df2 в зависимости от количество bonus у user_id из датасета df1. И делаю я это до тех пор, пока разница между максимальным значением bonus и минимальным не будет равна 1
Я начал делать следующее: ищу в первом датасете user_id с максимальным количеством бонусов:
max_bonus_user = df1.iloc[[df1['user_id'].idxmax()]]['user_id']
max_bonus_user
102
max_bonus = df1.iloc[[df1['bonus'].idxmax()]]['bonus']
max_bonus
3
и с минимальным:
min_bonus_user = df1.iloc[[df1['user_id'].idxmin()]]['user_id']
min_bonus_user
100
min_bonus = df1.iloc[[df1['bonus'].idxmin()]]['bonus']
min_bonus
1
сравниваю max_bonus с min_bonus. Если (max_bonus - min_bonus > 1) то мне нужно в df2 для ближайшего LVL с user_id с максимальным max_bonus заменить user_id на user_id с минимальным min_bonus. Помогите придумать алгоритм для такой обработки в цикле, всю голову себе сломал.