Индекс вне границ с помощью itertuples

1

У меня есть dataframe, как это:

user_id anime_id    user_rating
0   1   20  7.808497
1   3   20  8.000000
2   5   20  6.000000
3   6   20  7.808497
4   10  20  7.808497

он выглядит как базовый фреймворк для игры с рекомендательной системой.

У меня было ~ 7 миллионных строк, я немного сократил данные:

df = df[df["user_id"] < 2000]

пусть печатают n_users, n_items, у меня, конечно же, были пользователи из 1999 года, и ~ 6000items

У меня 2 проблемы. если я хочу построить свой учебный набор данных следующим образом:

ratings = np.zeros((n_users, n_items))
for row in df.itertuples():
    ratings[row[1]-1, row[2]-1] = row[3]

У меня есть "IndexError:

index 950 is out of bounds for axis 0 with size 949'

Я пробовал новые вещи с рядом [0] после комментария, что он не работает:

X = urm[["user_id", "anime_id"]].as_matrix()
y = urm["user_rating"].values
n_u = len(urm["user_id"].unique())
n_m = len(urm["anime_id"].unique())

R = np.zeros((n_u, n_m))
for idx, row in enumerate(X):
    R[row[0]-1, row[1]-1] = y[idx]

все тот же IndexError.

если я передаю строку, если строка в R.index: возвращает код только np.zeros matrix

Теги:
pandas
numpy
indexing

1 ответ

1
Лучший ответ

row[1] представляет user_id, а не ваш индекс user_id. Как только вы достигнете строки с user_id превышающей первое измерение ratings, вы увидите IndexError. Вместо этого используйте row[0] или row.Index для извлечения индекса строки, который затем можно использовать для индексации массива ratings.

Кроме того, обратите внимание, что df[df["user_id"] < 2000] сам по себе не гарантирует, что у вас есть пользователи из 1999 года. Например, некоторые user_id целочисленных идентификаторов user_id могут отсутствовать.

  • 0
    Я понимаю, но вы можете дать мне пример? я пытался сопоставить рейтинги [row [0] -1, row [1] -1] = row [2], но это все та же проблема с индексом, более того, я думаю, что результат будет отличаться от того, который я хочу.

Ещё вопросы

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