索引超出范围

时间:2018-07-02 15:51:25

标签: python pandas numpy indexing

我有一个像这样的数据框:

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

它看起来像是与推荐系统一起播放的基本数据框。

我有大约700万行,我像这样减少了数据框:

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中通过if行传递代码:代码仅返回np.zeros矩阵

1 个答案:

答案 0 :(得分:1)

row[1]代表user_id,而不是您的数据框索引。一旦到达user_id大于第一维度ratings的行,您将看到IndexError。而是使用row[0]row.Index提取行索引,然后可以使用该索引为ratings数组建立索引。

此外,请注意,df[df["user_id"] < 2000]本身并不能保证您拥有1999个用户。例如,某些user_id整数标识符可能会丢失。