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

Pandas透视DataFrame时保留重复ISBN的所有评分记录

解决方法

1. 保留所有重复的评分数据

你用pivot_table时重复记录被丢弃,是因为默认聚合函数是mean,会把同一User-ID和ISBN下的评分合并。要保留所有数据,只需指定aggfunc=list,让相同组合的评分以列表形式保留:

new = pd.pivot_table(ratings, values='Book-Rating', index='User-ID', columns='ISBN', aggfunc=list)

如果需要将每个重复评分作为独立行展示(而非列表),可以先给每组重复数据添加序号,再将序号纳入索引:

# 给每个(User-ID, ISBN)组合的重复项添加序号
ratings['repeat_id'] = ratings.groupby(['User-ID', 'ISBN']).cumcount()
# 用复合索引进行透视
new = ratings.pivot(index=['User-ID', 'repeat_id'], columns='ISBN', values='Book-Rating')

2. 解决大数据量下的索引越界错误

针对40万条数据出现的index is out of bounds错误,可按以下步骤排查处理:

  • 检查异常数据:先排查是否存在空值或非法索引值,比如空的User-ID/ISBN、非数值型ID:
    # 检查空值数量
    print(ratings[['User-ID', 'ISBN']].isnull().sum())
    # 查看User-ID的异常值示例
    print(ratings['User-ID'].unique()[:10])
    
    清理空值或转换非法值后再尝试透视。
  • 分块处理:如果内存不足导致报错,可分批次读取处理数据,再合并结果:
    chunks = []
    # 分块读取数据(按实际内存调整chunksize)
    for chunk in pd.read_csv('your_data.csv', chunksize=10000):
        chunk['repeat_id'] = chunk.groupby(['User-ID', 'ISBN']).cumcount()
        pivot_chunk = chunk.pivot(index=['User-ID', 'repeat_id'], columns='ISBN', values='Book-Rating')
        chunks.append(pivot_chunk)
    # 合并所有分块结果
    new = pd.concat(chunks)
    
  • 避免超宽表内存溢出:如果ISBN数量极多,透视后会生成超宽DataFrame,导致内存不足。这种情况下建议保留长格式数据,或仅筛选需要的ISBN列进行透视。

内容的提问来源于stack exchange,提问作者Muhammad Haris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:31:14