使用Pandas生成透视表时遇ValueError: negative dimensions are not allowed错误求助
解决pivot_table报错「negative dimensions are not allowed」的方案
1. 先排查合并后的重复数据
这个报错大概率是因为合并后的df_merge1里存在同一个用户(User-ID)对应同一本书(ISBN)的多条评分记录,导致透视表在计算维度时出现异常。
先执行代码检查重复项:
# 检查(User-ID, ISBN)的重复组合 dup_count = df_merge1.duplicated(subset=['User-ID', 'ISBN'], keep=False).sum() print(f"重复的用户-书籍组合数:{dup_count}") # 若有重复,查看示例 if dup_count > 0: print(df_merge1[df_merge1.duplicated(subset=['User-ID', 'ISBN'], keep=False)].head())
处理重复项的两种方式:
- 重复评分一致:直接去重
df_merge1 = df_merge1.drop_duplicates(subset=['User-ID', 'ISBN'], keep='first') - 重复评分不同:按规则聚合(比如取均值)
df_merge1 = df_merge1.groupby(['User-ID', 'ISBN'])['Book-Rating'].mean().reset_index()
2. 检查数据集规模是否过大
如果唯一用户数或唯一ISBN数特别多,透视表会生成超大型稀疏矩阵,可能触发内存或维度计算异常。先看基础统计:
print(f"唯一用户数:{df_merge1['User-ID'].nunique()}") print(f"唯一ISBN数:{df_merge1['ISBN'].nunique()}")
如果数据量过大,要么缩小数据集测试,要么改用稀疏矩阵存储:
from scipy.sparse import csr_matrix # 转换为稀疏矩阵替代普通透视表 sparse_bookmat = csr_matrix(pd.pivot_table(df_merge1, index='User-ID', columns='ISBN', values='Book-Rating').fillna(0))
3. 验证合并逻辑是否正确
检查合并操作是否引入了冗余数据:
- 确认
pd.merge的how参数(inner/left/right等)是否符合预期,避免意外引入大量无效数据 - 对比合并前后的行数,判断是否出现异常膨胀:
# 替换成你的原DataFrame名称 print(f"原用户数据行数:{df_users.shape[0]}") print(f"原书籍评分数据行数:{df_books.shape[0]}") print(f"合并后数据行数:{df_merge1.shape[0]}")
处理完以上步骤后,重新运行透视表代码即可解决问题。
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

