У меня есть датафрейм pandas со столбцами = имена пользователей строк = названия ресторанов. Значения являются рейтингами, данными пользователями. Затем отсортировано по значению. E.g.:
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
Я знаю, что должен быть лучший выход. Кроме того, возникает проблема создания дубликатов, когда в галстуке более двух ресторанов. Кроме того, я бы хотел, чтобы это работало для более чем двух пользователей. Спасибо!