python - 用户项目评分矩阵:IndexError
问题描述
我的数据框 urm 的形状为 (96438, 3)
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
我正在尝试建立一个项目用户评分矩阵:
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)
在索引 user_id 中,anime_id 在列中并为值评分(我从 pivot_table 得到了这个矩阵)
在一些教程中它可以工作,但我有一个
---------------------------------------------------------------------------
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
解决方案
我尝试了dennlinger的第二个建议,它对我有用。这是我写的代码:
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
推荐阅读
- javascript - 在 nodejs 的子进程的情况下,exe 运行速度要慢得多
- java - 如何获得带有缺口的 Android 手机的正确屏幕尺寸
- python - 比较包装函数是否是装饰器的实例
- python - 如何删除熊猫中属于同一组的某些 k 条目,例如余额类?
- python - 如何确定嵌套列表结构是否与另一个相同,但元素交换为新的
- postgresql - 错误:类型时间戳的无效输入语法:“20-MAR-17 08.30.41.453267 AM”
- loops - 如何创建动态 while 循环?
- php - 获取值列表,然后获取具有该值的所有帖子标题
- java - 如何在 BasicInterpreter 的 GETSTATIC 和 PUTSTATIC 命令中唯一标识静态变量
- python - 如何使用 Pandas 保留我的组中使用的列名