使用NumPy将用户/项目评级转换为二维数组

时间:2013-11-20 18:55:53

标签: python numpy multidimensional-array pandas

使用某些用户/项目/评级数据执行某些分类。我的问题是如何将这3列转换为用户(行),项目(列)和填充矩阵的评级数据矩阵。

User  Item  ItemRating
1     23    3
2     204   4
1     492   2
3     23    4

等等。我尝试使用DataFrame但是出现了NULL错误。

1 个答案:

答案 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]])

请注意,结果不同,因为在第二种方法中,不存在的值设置为零。

选择一个更适合你的人;)