如何使用数据透视表解决内存溢出问题?

时间:2019-07-31 17:47:03

标签: python pandas numpy

我有两个中等大小的数据集,如下所示:

books_df.head()

    ISBN    Book-Title  Book-Author
0   0195153448  Classical Mythology     Mark P. O. Morford
1   0002005018  Clara Callan    Richard Bruce Wright
2   0060973129  Decision in Normandy    Carlo D'Este
3   0374157065  Flu: The Story of the Great Influenza Pandemic...   Gina Bari Kolata
4   0393045218  The Mummies of Urumchi  E. J. W. Barber

ratings_df.head()

    User-ID     ISBN    Book-Rating
0   276725  034545104X  0
1   276726  0155061224  5
2   276727  0446520802  0
3   276729  052165615X  3
4   276729  0521795028  6

我想要一个像这样的数据透视表:

ISBN    1   2   3   4   5   6   7   8   9   10  ... 3943    3944    3945    3946    3947    3948    3949    3950    3951    3952
User-ID                                                                                 
1   5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
3   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
4   0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5   0.0 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0

我尝试过:

R_df = ratings_df.pivot(index = 'User-ID', columns ='ISBN', values = 'Book-Rating').fillna(0) # Memory overflow

因以下原因而失败:

  

MemoryError:

这:

R_df = q_data.groupby(['User-ID', 'ISBN'])['Book-Rating'].mean().unstack()

因相同而失败。

我想将其用于奇异值分解和矩阵分解。

有什么想法吗?

我正在使用的数据集是:http://www2.informatik.uni-freiburg.de/~cziegler/BX/

1 个答案:

答案 0 :(得分:0)

一种选择是使用熊猫Sparse功能,因为这里的数据非常稀疏:

In [11]: df
Out[11]:
   User-ID        ISBN  Book-Rating
0   276725  034545104X            0
1   276726  0155061224            5
2   276727  0446520802            0
3   276729  052165615X            3
4   276729  0521795028            6

In [12]: res = df.groupby(['User-ID', 'ISBN'])['Book-Rating'].mean().astype('Sparse[int]')

In [13]: res.unstack(fill_value=0)
Out[13]:
ISBN     0155061224  034545104X  0446520802  052165615X  0521795028
User-ID
276725            0           0           0           0           0
276726            5           0           0           0           0
276727            0           0           0           0           0
276729            0           0           0           3           6

In [14]: _.dtypes
Out[14]:
ISBN
0155061224    Sparse[int64, 0]
034545104X    Sparse[int64, 0]
0446520802    Sparse[int64, 0]
052165615X    Sparse[int64, 0]
0521795028    Sparse[int64, 0]
dtype: object

我的理解是,您可以将其与scipy一起使用,例如对于SVD:

In [15]: res.unstack(fill_value=0).sparse.to_coo()
Out[15]:
<4x5 sparse matrix of type '<class 'numpy.int64'>'
    with 3 stored elements in COOrdinate format>