Python 用户项目评级矩阵:索引器

Python 用户项目评级矩阵:索引器,python,pandas,numpy,indexoutofboundsexception,Python,Pandas,Numpy,Indexoutofboundsexception,我的数据帧urm的形状为(96438,3) 我正在尝试建立一个项目用户评分矩阵: 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[r

我的数据帧urm的形状为(96438,3)

我正在尝试建立一个项目用户评分矩阵:

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]
如果代码成功,矩阵如下所示:(我用0填充NaN)

索引中的用户id、列中的动画id和值的评级(我从pivot_表中得到了这个矩阵)

在一些教程中它是有效的,但我有一个

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-278-0e06bd0f3133> in <module>()
     15 R = np.zeros((n_u, n_m))
     16 for idx, row in enumerate(X):
---> 17     R[row[0]-1, row[1]-1] = y[idx]

IndexError: index 5276 is out of bounds for axis 1 with size 5143
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
15 R=np.零((n_,n_m))
16对于idx,枚举(X)中的行:
--->17 R[行[0]-1,行[1]-1]=y[idx]
索引器:索引5276超出大小为5143的轴1的界限

我假设您有非连续的用户ID(或电影ID),这意味着存在具有

  • 无评级,或
  • 没有电影
在本例中,您设置矩阵维度时假设每个值都是连续的(因为您使用唯一值的数量定义维度),这会导致一些非连续值超出范围

在这种情况下,您有两种选择:

  • 您可以通过
    urm[“anime\u id”].max()将矩阵的大小定义为
    urm[“user\u id”].max()
  • 创建一个字典,将您的值映射到最低的连续值
第一种方法的缺点显然是需要存储更大的矩阵。此外,您还可以使用
scipy.sparse
从现有的数据格式(通常称为)创建矩阵。
您可能会执行以下操作:

from scipy import sparse
# scipy expects the data in (value_column, (x, y))
mat = sparse.coo_matrix((urm["user_rating"], (urm["user_id"], urm["anime_id"]))
# if you want it as a dense matrix
dense_mat = mat.todense()

然后,您也可以按照自己的方式提出第二个建议,正如我之前所问的那样,我尝试了丹尼林格的第二个建议,它对我有效。 这就是我写的代码:

def id_to_index(df):
    """
    maps the values to the lowest consecutive values
    :param df: pandas Dataframe with columns user, item, rating
    :return: pandas Dataframe with the extra columns index_item and index_user
    """

    index_item = np.arange(0, len(df.item.unique()))
    index_user = np.arange(0, len(df.user.unique()))

    df_item_index = pd.DataFrame(df.item.unique(), columns=["item"])
    df_item_index["new_index"] = index_item
    df_user_index = pd.DataFrame(df.user.unique(), columns=["user"])
    df_user_index["new_index"] = index_user

    df["index_item"] = df["item"].map(df_item_index.set_index('item')["new_index"]).fillna(0)
    df["index_user"] = df["user"].map(df_user_index.set_index('user')["new_index"]).fillna(0)


    return df

请提供一份报告。在这种情况下,错误与您的数据不匹配。此外,向我们展示您对逻辑输出的期望。它很有效。谢谢,我更了解,我将探讨您对稀疏矩阵的建议!
def id_to_index(df):
    """
    maps the values to the lowest consecutive values
    :param df: pandas Dataframe with columns user, item, rating
    :return: pandas Dataframe with the extra columns index_item and index_user
    """

    index_item = np.arange(0, len(df.item.unique()))
    index_user = np.arange(0, len(df.user.unique()))

    df_item_index = pd.DataFrame(df.item.unique(), columns=["item"])
    df_item_index["new_index"] = index_item
    df_user_index = pd.DataFrame(df.user.unique(), columns=["user"])
    df_user_index["new_index"] = index_user

    df["index_item"] = df["item"].map(df_item_index.set_index('item')["new_index"]).fillna(0)
    df["index_user"] = df["user"].map(df_user_index.set_index('user')["new_index"]).fillna(0)


    return df