使用某些用户/项目/评级数据执行某些分类。我的问题是如何将这3列转换为用户(行),项目(列)和填充矩阵的评级数据矩阵。
User Item ItemRating
1 23 3
2 204 4
1 492 2
3 23 4
等等。我尝试使用DataFrame但是出现了NULL错误。
答案 0 :(得分:14)
这是一个支点,如果我的想法是正确的,大熊猫就会如下。
加载数据:
import pandas as pd
df = pd.read_csv(fname, sep='\s+', header=None)
df.columns = ['User','Item','ItemRating']
透视它:
>>> df
User Item ItemRating
0 1 23 3
1 2 204 4
2 1 492 2
3 3 23 4
>>> df.pivot(index='User', columns='Item', values='ItemRating')
Item 23 204 492
User
1 3 NaN 2
2 NaN 4 NaN
3 4 NaN NaN
对于一个numpy示例,让我们使用StringIO
模拟文件:
from StringIO import StringIO
data ="""1 23 3
2 204 4
1 492 2
3 23 4"""
并加载它:
>>> arr = np.genfromtxt(StringIO(data), dtype=int)
>>> arr
array([[ 1, 23, 3],
[ 2, 204, 4],
[ 1, 492, 2],
[ 3, 23, 4]])
pivot基于this answer
rows, row_pos = np.unique(arr[:, 0], return_inverse=True)
cols, col_pos = np.unique(arr[:, 1], return_inverse=True)
rows, row_pos = np.unique(arr[:, 0], return_inverse=True)
cols, col_pos = np.unique(arr[:, 1], return_inverse=True)
pivot_table = np.zeros((len(rows), len(cols)), dtype=arr.dtype)
pivot_table[row_pos, col_pos] = arr[:, 2]
结果:
>>> pivot_table
array([[ 3, 0, 2],
[ 0, 4, 0],
[ 4, 0, 0]])
请注意,结果不同,因为在第二种方法中,不存在的值设置为零。
选择一个更适合你的人;)