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
相关产品推荐
相关产品推荐

