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

Python基于用户的协同过滤推荐报错:字符串索引需为整数而非Series

解决TypeError: 'string indices must be integers, not Series'问题

咱们先定位错误根源,再一步步修正你的代码:

错误原因分析

你遇到的TypeError主要来自两个核心问题:

  1. 无效的筛选条件导致rating_c为空:你用userArtist.artist.isnull().values筛选数据,但你的数据集里artist列没有空值,这会让rating_c变成空的DataFrame,后续对空表的操作自然会触发异常。
  2. 相似用户与目标艺术家的筛选逻辑不严谨:你直接取了相关系数前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:09