Чтобы сделать это быстро, сделать это с Numpy инструменты:
def pivotarray(df):
users,i= np.unique(df['user'],return_inverse=True)
item,j= np.unique(df['item'],return_inverse=True)
a=zeros((len(users),len(item)),int)
a[i,j]=df['rating']
return a
Тогда (вы можете заполнить с NaN раньше, если необходимое):
In [464]: pivotarray(df)
Out[464]:
array([[0, 2, 5, 0],
[5, 0, 0, 0],
[3, 0, 0, 1],
[1, 0, 4, 0]])
колонок-не существует, потому что нет ни одного пункта 2.
Gain является младшим:
In [465]: %timeit pivotarray(df)
1000 loops, best of 3: 417 µs per loop
In [466]: %timeit df.pivot(index='user', columns='item', values='rating')
100 loops, best of 3: 6.38 ms per loop
In [467]: %timeit df.pivot_table(index='user', columns='item', values='rating')
100 loops, best of 3: 18.6 ms per loop
EDIT
для включения недостающих элементов, возможный хак:
def pivotarraywithallitems(df):
users,i= np.unique(df['user'],return_inverse=True)
item,j= np.unique(df['item'],return_inverse=True)
miss= (~in1d(arange(1,6),item)).cumsum()
j+=miss[j]
a=zeros((len(users),len(item)+miss[-1]),float)*NaN
a[i,j]=df['rating']
return a
благодарю вас за ответ. Я получил значение ValueError: Index содержит повторяющиеся записи, не может изменить форму ошибки. Я не добавлял отсутствующих столбцов, поскольку это не было необходимо. Есть ли у вас какие-либо идеи? Благодарю. –
Очень распространенная ошибка и решение 'pivot_table' с' aggfunc'. Dont forget 'default 'aggfunc' is' np.mean' – jezrael