2016-12-13 6 views
1

私はアイテムアイテムの共同推奨コードを作成しようとしています。私の完全なデータセットはhereです。ユーザーが行になり、項目が列になり、評価が値になるようにします。次のようにValueError:pandas pivot_tableを使用して負の次元は使用できません

私のコードは次のとおりです。

   user  item rating timestamp 
0 A2EFCYXHNK06IS 5555991584  5 978480000 
1 A1WR23ER5HMAA9 5555991584  5 953424000 
2 A2IR4Q0GPAFJKW 5555991584  4 1393545600 
3 A2V0KUVAB9HSYO 5555991584  4 966124800 
4 A1J0GL9HCA7ELW 5555991584  5 1007683200 

し、エラーがある:次のように私のデータがある

import pandas as pd  
import numpy as np 
file = pd.read_csv("data.csv", names=['user', 'item', 'rating', 'timestamp']) 
table = pd.pivot_table(file, values='rating', index=['user'], columns=['item']) 

Traceback (most recent call last): 
    File "D:\python\reco.py", line 9, in <module> 
    table=pd.pivot_table(file,values='rating',index=['user'],columns=['item']) 
    File "C:\python35\lib\site-packages\pandas\tools\pivot.py", line 133, in pivot_table  
     table = agged.unstack(to_unstack) 
    File "C:\python35\lib\site-packages\pandas\core\frame.py", line 4047, in  unstack 
    return unstack(self, level, fill_value) 
    File "C:\python35\lib\site-packages\pandas\core\reshape.py", line 402, in unstack  
    return _unstack_multiple(obj, level)  
    File "C:\python35\lib\site-packages\pandas\core\reshape.py", line 297, in _unstack_multiple 
    unstacked = dummy.unstack('__placeholder__') 
    File "C:\python35\lib\site-packages\pandas\core\frame.py", line 4047, in unstack 
    return unstack(self, level, fill_value) 
    File "C:\python35\lib\site-packages\pandas\core\reshape.py", line 406, in unstack 
    return _unstack_frame(obj, level, fill_value=fill_value) 
    File "C:\python35\lib\site-packages\pandas\core\reshape.py", line 449, in _unstack_frame 
    fill_value=fill_value) 
    File "C:\python35\lib\site-packages\pandas\core\reshape.py", line 103, in __init__ 
    self._make_selectors() 
    File "C:\python35\lib\site-packages\pandas\core\reshape.py", line 137, in _make_selectors 
    mask = np.zeros(np.prod(self.full_shape), dtype=bool) 
ValueError: negative dimensions are not allowed 
+0

[ValueError:負の次元は使用できません](http://stackoverflow.com/questions/19938587/valueerror-negative-dimensions-are-not-allowed) – Hamms

+0

@Hamms。それを重複としてマークしないで、私はすでにあなたが提供したリンクを見ました。しかし、そこの答えのどれも私の状況には役に立たない。私は行列の乗算をしていません。 –

+0

あなたのデータのサンプルを含めてください:[mcve](http://stackoverflow.com/help/mcve)。このピボット・テーブルの呼び出しはこのサンプル・データのために働くので、ここでは絶対に重要です: 'df = pd.DataFrame(np.random.rand(10,4)、columns = ['user'、 'item'、 'rating' 、 'タイムスタンプ']) '。 –

答えて

2

私は(これが完了することを保証することはできません私はそれが計算を待つのにうんざりしています)、ここではメモリを最小限に抑える必要のある疎なデータフレームを作成する方法がありますそして助けてください。

import pandas as pd 
import numpy as np 
file=pd.read_csv("data.csv",names=['user','item','rating','timestamp']) 

from scipy.sparse import csr_matrix 

user_u = list(sorted(file.user.unique())) 
item_u = list(sorted(file.item.unique())) 

row = file.user.astype('category', categories=user_u).cat.codes 
col = file.item.astype('category', categories=item_u).cat.codes 

data = file['rating'].tolist() 

sparse_matrix = csr_matrix((data, (row, col)), shape=(len(user_u), len(item_u))) 

df = pd.SparseDataFrame([ pd.SparseSeries(sparse_matrix[i].toarray().ravel(), fill_value=0) 
           for i in np.arange(sparse_matrix.shape[0]) ], 
         index=user_u, columns=item_u, default_fill_value=0) 

詳細については、this questionを参照してください。

+1

+1、これがこのデータを処理する唯一の方法です。完全な高密度評価マトリックスは127Bを超えるエントリーを持ち、大きすぎてメモリーに収まらない。 'Series.cat.categories'を使用して、疎なデータフレームのインデックスを作成し、' list(sorted(...)) 'を避けることもできます。 –

+0

@julien私はこれを試してみます。あなたの助けに感謝します。私は最後の2日間この問題に立ち往生しています。 –

+0

走らせて、それがうまくいくかどうか私に知らせてください、私は好奇心です –

関連する問題