После сортировки по значению, как сортировать по максимальному минимуму

1

У меня есть пандас dataframe с колонками = имена пользователей строк = названия ресторанов. Значения являются рейтингами, данными пользователями. Затем отсортировано по значению. Например:

ratings = pd.DataFrame(data=[[1, 4], [5, 8], [7, 9], [3, 4], [8, 8], [6, 7], [5, 2], [4, 9]], 
                        index=['rest1', 'rest2', 'rest3', 'rest4', 'rest5', 'rest6', 'rest7', 'rest8'], 
                        columns=[user1, user2])

ratings_sorted = preds_db.sort_values(by='mean', ascending=False)

Теперь, в случае ничьей, я хочу, чтобы ресторан с более высокими минимальными значениями для обоих пользователей был оценен выше. Например, rest2, rest6 и rest8 имеют средние значения 6,5, но я хочу, чтобы они были ранжированы следующим образом: rest6> rest2> rest8, так как rest6 = (6, 7), rest2 = (5, 8), rest8 = (4, 9).

Мой план состоял в том, чтобы составить новый список ресторанов и использовать его в качестве нового индекса. Вот моя супер грязная попытка:

def highest_min(rest1, rest2, db):
    if db.loc[rest1].min() > db.loc[rest2].min():
        return [rest1, rest2]
    return [rest2, rest1]

def add_resorted_column(preds_db_sorted):
    resorted = []
    for i, rest in enumerate(preds_db_sorted.index):
        if i < len(preds_db_sorted.index)-1:
            if preds_db_sorted.iloc[i]['mean'] != preds_db_sorted.iloc[i+1]['mean']:
                if preds_db_sorted.index[i] not in resorted:
                    resorted.append(rest)
            else:
                resorted.extend(highest_min(
                            preds_db_sorted.index[i], 
                            preds_db_sorted.index[i+1], 
                            preds_db_sorted))
        else: 
            if preds_db_sorted.index[-1] not in resorted:
                resorted.append(preds_db_sorted.index[-1]) 
    return resorted

Я знаю, что должен быть лучший выход. Кроме того, возникает проблема создания дубликатов, когда в галстуке более двух ресторанов. Кроме того, я бы хотел, чтобы это работало для более чем двух пользователей. Спасибо!

Теги:
pandas
sorting
min

2 ответа

1

Просто используя mean и min с concat и concat их вместе

idx=pd.concat([ratings.mean(1),ratings.min(1)],axis = 1).\
        sort_values([0,1],ascending=[True,False]).\
             index
ratings.loc[idx]
       user1  user2
rest1      1      4
rest4      3      4
rest7      5      2
rest6      6      7
rest2      5      8
rest8      4      9
rest5      8      8
rest3      7      9
ratings=ratings.loc[idx]
0
    import pandas as pd
    ratings = pd.DataFrame(data=[[1, 4], [5, 8], [7, 9], [3, 4], [8, 8], [6, 7], [5, 2], [4, 9]], 
                            index=['rest1', 'rest2', 'rest3', 'rest4', 'rest5', 'rest6', 'rest7', 'rest8'], 
                            columns=['user1', 'user2'])
    ratings['mean']=ratings.mean(axis=1)
    ratings['min']=ratings.min(axis=1)
    ratings_sorted = ratings.sort_values(by=['mean','min'], ascending=False)
    print(ratings_sorted)
  • 0
    Вау, это было супер просто и понятно. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню