Уравнивание пользователей в одном датасете по значениям из другого 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. Помогите придумать алгоритм для такой обработки в цикле, всю голову себе сломал.


Ответы (0 шт):