我有一个用户,书籍和评分的数据集,我想找到对特定书籍评价最高的用户,对于那些用户,我也想找到他们也喜欢的其他书籍。
我的数据如下:
private fun saveFileToExternalStorage(directory:File?,filePath:String,targetFileName:String){
var uri:Uri? = null
val values:ContentValues = ContentValues()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q){
values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpg")
values.put(MediaStore.Images.Media.DATE_ADDED,System.currentTimeMillis() / 1000)
values.put(MediaStore.Images.Media.TITLE, targetFileName)
values.put(MediaStore.Images.Media.DISPLAY_NAME, targetFileName)
values.put(MediaStore.Images.Media.DATE_TAKEN,System.currentTimeMillis())
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES+"/My_App_Folder")
values.put(MediaStore.Images.Media.IS_PENDING, 1)
uri= contentResolver.insert(MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY),values)
}
val baseFile = File(filePath)
if(baseFile.exists()){
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.Q){
directory?.let {
val targetFile = File(it.path+File.separator+targetFileName)
baseFile.copyTo(targetFile)
}
}else{
uri?.let {
val outputStream: OutputStream? = contentResolver.openOutputStream(uri)
outputStream?.let{
val inputStream: InputStream = File(filePath).inputStream()
inputStream.copyTo(outputStream,1024)
}
values.clear()
values.put(MediaStore.Images.Media.IS_PENDING, 0)
contentResolver.update(uri,values,null,null)
}
}
baseFile.delete()
}
}
我到目前为止做过:
df.sample(5)
User-ID ISBN Book-Rating
49064 102967 0449244741 8
60600 251150 0452264464 9
376698 52853 0373710720 7
454056 224764 0590416413 7
54148 25409 0312421273 9
最后一行失败
KeyError:“用户ID”
我想获得将LOTR> 7评为那些用户的用户,以便进一步从矩阵中找到他们也喜欢的电影。
我们将不胜感激。谢谢。
答案 0 :(得分:1)
在like_lotr
数据帧'User-ID'
中,索引的名称无法像普通列一样选择。这就是为什么行users = like_lotr['User-ID']
引发KeyError
的原因。它不是列。
此外,ix
已过时,最好使用loc
。并且不要用引号引起来:它必须是整数,因为'User-ID'
最初是一列整数(至少来自您的示例)。
尝试这样:
df_p = df.pivot_table(index='ISBN', columns='User-ID', values='Book-Rating').fillna(0)
lotr = df_p.loc[452264464] # used another number from your sample dataframe to test this code.
like_lotr = lotr[lotr > 7].to_frame()
users = like_lotr.index.tolist()
user
现在是包含所需ID的列表。
使用上面的小样本和我用来测试的数字,user
是[251150]
。
另一种解决方案是使用reset_index
。最后两行应该看起来像这样:
like_lotr = lotr[lotr > 7].to_frame().reset_index()
users = like_lotr['User-ID']
reset_index
将索引放回列中。