pandas ValueError:不允许使用pandas pivot_table 负维度
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/41132363/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
ValueError: negative dimensions are not allowed using pandas pivot_table
提问by Prashant Sharma
I am trying to make item-item collaborative recommendation code. My full dataset can be found here. I want the users to become rows, items to become columns, and ratings to be the values.
我正在尝试制作 item-item 协作推荐代码。我的完整数据集可以在这里找到。我希望用户成为行,项目成为列,评级成为值。
My code is as follows:
我的代码如下:
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'])
My data is as follows:
我的数据如下:
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
And the error is:
错误是:
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
回答by Julien Marrec
I cannot guarantee that this will complete (I got tired of waiting for it to compute), but here's a way to create a sparse dataframe that hopefully should minimize memory and help.
我不能保证这会完成(我已经厌倦了等待它计算),但这里有一种创建稀疏数据帧的方法,希望可以最大限度地减少内存和帮助。
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)
See this questionfor more options.
有关更多选项,请参阅此问题。