在Python中,TypeError:不支持的操作数类型为 - :'str'和'int'
问题描述:
我正在通过使用Movielens数据集进行协作过滤制作Movie Recommender系统。 于是我跟着this:http://blog.ethanrosenthal.com/2015/11/02/intro-to-collaborative-filtering/在Python中,TypeError:不支持的操作数类型为 - :'str'和'int'
,但它并不在LN工作[8]:
import numpy as np
import pandas as pd
data = open('ratings.csv')
names = ['user_id','item_id','rating','timestamp']
df = pd.read_csv('ratings.csv', sep=',', names=names)
df.head()
n_users = df.user_id.unique().shape[0]
n_items = df.item_id.unique().shape[0]
print (str(n_users) + ' users')
print (str(n_items) + ' items')
ratings = np.zeros((n_users, n_items))
for row in df.itertuples():
ratings[row[1]-1, row[2]-1] = row[3]
ratings
sparsity = float(len(ratings.nonzero()[0]))
sparsity /= (ratings.shape[0] * ratings.shape[1])
sparsity *= 100
print ('Sparsity: {:4.2f}%'.format(sparsity))
并没有错误这样的:
line 17, in <module>
ratings[row[1]-1, row[2]-1] = row[3]
TypeError: unsupported operand type(s) for -: 'str' and 'int'
答
您阅读CSV数据帧的,默认是将该数据读取为字符串。然后尝试使用数据帧中的行,期望这些值是数字(从中减去1),并且失败。
要么指定dtype
(适用于所有的列或使用每列的映射),或使用通行证在converters
映射(映射列索引或列名转换函数)。由于该数据是所有整数(ID号,因为一个划时代的评级和时间戳单位:秒),速战速决将在这里使用dtype=np.int32
:
df = pd.read_csv('ratings.csv', sep=',', names=names, dtype=np.int32)
的'Exception'是明确的 - 你'row's举行'str's。 – AChampion