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