You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas用pivot_table生成评分矩阵报int32溢出错误如何解决?

问题判断

你的操作逻辑没有错误。报错核心原因是全量评分矩阵规模远超pivot_table的处理上限:26744个movieId与138493个userId组合后总单元格数超过37亿,既触发了pivot_table底层int32类型的索引溢出,就算强行生成稠密矩阵也会占用超过100GB内存,完全不具备实际运行可行性。

解决方法

方法1:缩小输入数据集规模(论坛建议的落地实现)

通过过滤低活跃度用户、低热度电影压缩数据规模,可自行调整阈值匹配硬件性能:

# 计算用户评分次数、电影被评分次数
user_rating_count = ratings['userId'].value_counts()
movie_rating_count = ratings['movieId'].value_counts()

# 示例:保留评分≥20次的用户,和被评分≥50次的电影
valid_users = user_rating_count[user_rating_count >= 20].index
valid_movies = movie_rating_count[movie_rating_count >= 50].index

# 过滤得到小规模子数据集
small_ratings = ratings[ratings['userId'].isin(valid_users) & ratings['movieId'].isin(valid_movies)]

# 再生成评分矩阵即可正常运行
ratings_matrix = small_ratings.pivot_table(index='movieId', columns='userId', values='rating').fillna(0)
ratings_matrix.head(5)

方法2:使用稀疏矩阵存储(推荐,适配全量数据)

评分矩阵属于极度稀疏矩阵,99%以上的单元格都是空值,用稀疏矩阵存储可以完全避免内存浪费和溢出问题,适合需要处理全量数据的场景:

from scipy.sparse import csr_matrix

# 对userId、movieId做连续编码,避免索引不连续浪费空间
ratings['user_code'] = ratings['userId'].astype('category').cat.codes
ratings['movie_code'] = ratings['movieId'].astype('category').cat.codes

# 生成稀疏评分矩阵
ratings_sparse = csr_matrix((ratings['rating'], (ratings['movie_code'], ratings['user_code'])))

后续的矩阵运算大多数机器学习库都可以直接适配csr格式的稀疏矩阵,不需要转成稠密矩阵。

方法3:使用分块计算框架

如果业务要求必须使用全量稠密矩阵做计算,可以换用Dask等支持分块计算的框架,将大矩阵拆分为多个小分块分批处理,规避内存和溢出限制。


内容的提问来源于stack exchange,提问作者hubbaka ghoyati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 16:45:09