我有一个dataframe对象,如下所示:
'Name' 'Book' 'Rating'
'John' 'Moby Dick' 5
'John' 'The Alchemist' 3
'John' 'The Da Vinci Code' 4
'Peter' 'Moby Dick' 4
'Peter' 'Lolita' 5
'Mike' 'The Alchemist' 4
'Mike' 'The Da Vinci Code' 3
我想从这个数据中创建一个二维数组,大小为[len('Name')][len('Book')],数组的值应该是额定值。如果一个人没有给一本书评级,价值应该是零
5 3 0 4
4 0 5 0
0 4 0 3
在这里,我的第一行对应约翰,下一行对应彼得,最后一行对应迈克,第一列对应白鲸,第二列对应炼金术士,第三列对应洛丽塔,第四列对应达芬奇密码
我尝试了以下方法,扫描整个对象(我相信是两次,以获得每列的匹配)
import pandas
import numpy
df = read_from_file
uName = df['Name'].unique().tolist()
uBook = df['Book'].unique().tolist()
m = numpy.zeros((len(uName), len(uBook)))
for i in range(0, len(uName)):
for j in range(0, len(uBook)):
x = df.loc[(df['Name'] == uName[i]) & (df['Book'] == uBook[j])]
if x.empty:
m[i][j] = 0
else:
m[i][j] = x.Rating
它给了我正确的结果,但它是非常低效的。我的数据帧是巨大的-~50000行,运行这段代码需要很长时间。你能帮我找到一个更有效的方法吗?谢谢
数据(temp.csv):
代码:
输出
或者
对于您的数据帧,代码应该是这样的:
相关问题 更多 >
编程相关推荐