PANDAS:int32溢出?无法建立数据透视表

时间:2019-06-27 11:44:05

标签: python pandas bigdata integer-overflow

我使用 pd.pivot_table()方法通过旋转用户项活动数据来创建用户项矩阵。但是,数据帧太大,以至于我这样抱怨:

  

未堆叠的DataFrame太大,导致 int32溢出

有关解决此问题的任何建议?谢谢!

r_matrix = df.pivot_table(values='rating', index='userId', columns='movieId')

4 个答案:

答案 0 :(得分:1)

您可以改用groupby。尝试以下代码:

reviews.groupby(['userId','movieId'])['rating'].max().unstack()

答案 1 :(得分:0)

库代码内部的整数溢出无济于事。您基本上有三个选择:

  1. 更改您提供给库的输入数据,以免发生溢出。在某种意义上,您可能需要使输入变小。如果这样做没有帮助,则可能是您以错误的方式使用该库或遇到了库中的错误。
  2. 使用不同的库(或完全不使用);似乎您正在使用的库不是要在较大的输入上运行的。
  3. 修改库的代码本身,以便它可以处理您的输入。这可能很难做到,但是如果您向库源代码提交拉取请求,很多人将从中受益。

您没有提供太多代码,所以我不能告诉您什么是最佳解决方案。

答案 2 :(得分:0)

某些解决方案:

  • 您可以将熊猫版本降级到0.21,这对于包含大数据的数据透视表来说是没有问题的。
  • 您可以将数据设置为字典格式,例如df.groupby('EVENT_ID')['DIAGNOSIS'].apply(list).to_dict()

答案 3 :(得分:0)

如果要将 movieId 作为列,请首先使用movieId作为键对数据框进行排序。

然后将数据帧划分(一半),以便每个子集包含特定电影的所有评分。

subset1 = df[:n] 
subset2 = df[n:]

现在,将其应用于每个子集

matrix1 = subset1.pivot_table(values='rating', index='userId', columns='movieId')
matrix2 = subset2.pivot_table(values='rating', index='userId', columns='movieId')

最后使用

连接matrix1和matrix2
complete_matrix = matrix1.join(matrix2)

另一方面,如果您要 userId 作为列,请使用userId作为键对数据框进行排序,然后重复上述过程。

***完成操作后,请务必删除subset1,subset2,matrix1和matrix2,否则将出现内存错误。