Python基于用户的协同过滤推荐报错:字符串索引需为整数而非Series
解决TypeError: 'string indices must be integers, not Series'问题
咱们先定位错误根源,再一步步修正你的代码:
错误原因分析
你遇到的TypeError主要来自两个核心问题:
- 无效的筛选条件导致
rating_c为空:你用userArtist.artist.isnull().values筛选数据,但你的数据集里artist列没有空值,这会让rating_c变成空的DataFrame,后续对空表的操作自然会触发异常。 - 相似用户与目标艺术家的筛选逻辑不严谨:你直接取了相关系数前5个用户,但没有过滤随机用户已经听过的艺术家,也没确保这些相似用户在原始数据中有对应记录。
修正后的代码
import numpy as np import pandas as pd # 构建用户-艺术家二值矩阵(1=听过,0=没听过) music_mat = userArtist.pivot_table( index='artist', columns='users', values='plays' ).fillna(0).apply(np.sign) # 随机选择目标用户 random_user = np.random.choice(userArtist['users']) print(f"目标随机用户: {random_user}") # 获取该用户听过的艺术家列表 random_user_rated = music_mat[random_user] random_user_artists = random_user_rated[random_user_rated > 0].index # 计算所有用户与目标用户的相似度(皮尔逊相关系数) user_corr = music_mat.corrwith(random_user_rated) # 取相似度最高的前5个用户(排除自己) top_similar_users = user_corr[user_corr.index != random_user].nlargest(5) print(f"最相似的5个用户: {top_similar_users.index.tolist()}") # 筛选:相似用户听过,但目标用户没听过的艺术家记录 rating_c = userArtist[ (userArtist['users'].isin(top_similar_users.index)) & (~userArtist['artist'].isin(random_user_artists)) ] # 映射相似用户的相似度值 rating_c['similarity'] = rating_c['users'].map(top_similar_users) # 计算加权评分:相似度 × 播放次数 rating_c['sim_rating'] = rating_c['similarity'] * rating_c['plays'] # 按艺术家分组,计算归一化加权评分,取Top3推荐 recommendation = rating_c.groupby('artist').apply( lambda group: group['sim_rating'].sum() / group['similarity'].sum() ).sort_values(ascending=False).head(3) print("\nTop 3艺术家推荐:") print(recommendation)
关键修正点说明
- 修正筛选逻辑:用
~userArtist['artist'].isin(random_user_artists)精准过滤目标用户没听过的艺术家,同时用userArtist['users'].isin(top_similar_users.index)确保只取相似用户的有效记录,让rating_c拥有可用数据。 - 优化相似用户选取:先排除目标用户自身,再取相似度最高的前5个,避免无效的自相似计算。
- 避免空值与异常计算:分组计算时确保每个分组都有有效相似度值,不会出现除以0的情况。
原代码的核心错误点验证
你写的userArtist.artist.isnull().values是完全错误的:
userArtist.artist.isnull()本身就是布尔Series,不需要额外加.values;更关键的是你的数据集里没有空的artist值,这会导致筛选结果全为False,rating_c直接是空表,后续的map和分组操作自然会触发string indices must be integers, not Series这类异常。
内容的提问来源于stack exchange,提问作者Mr. Jibz
相关产品推荐
相关产品推荐

