【问题标题】:Python Pandas to_pickle cannot pickle large dataframesPython Pandas to_pickle 无法腌制大型数据帧
【发布时间】:2015-06-15 08:26:10
【问题描述】:

我有一个包含 500,000 行的数据框“DF”。以下是每列的数据类型:

ID      int64
time    datetime64[ns]
data    object

“数据”列中的每个条目都是一个大小 = [5,500] 的数组

当我尝试使用

保存此数据框时
DF.to_pickle("my_filename.pkl")

它返回了以下错误:

     12     """
     13     with open(path, 'wb') as f:
---> 14         pkl.dump(obj, f, protocol=pkl.HIGHEST_PROTOCOL) 

OSError: [Errno 22] Invalid argument

我也尝试过这种方法,但我得到了同样的错误:

import pickle


with open('my_filename.pkl', 'wb') as f:
    pickle.dump(DF, f)

我尝试保存这个数据框的 10 行:

DF.head(10).to_pickle('test_save.pkl')

我完全没有错误。因此,它可以保存小的DF,但不能保存大的DF。

我在 Mac 中使用 python 3、ipython notebook 3。

请帮我解决这个问题。我真的需要将此 DF 保存到泡菜文件中。我在互联网上找不到解决方案。

【问题讨论】:

  • 你试过 cPickle 吗?无论如何,对大量数据使用泡菜并不是最理想的。并不是说我相信它可以解决问题,但它是可能的。
  • cPickle 在 python 3 中不可用。
  • 内存中的数据帧到底有多大?
  • 这是一个错误,待修复:bugs.python.org/issue24658

标签: python pandas pickle


【解决方案1】:

可能不是您希望的答案,但这就是我所做的......

使用 np.array_split 将数据帧拆分成更小的块(虽然 numpy 函数不能保证工作,但现在可以工作,尽管它曾经有一个错误)。

然后腌制较小的数据帧。

当你解开它们时,使用 pandas.append 或 pandas.concat 将所有东西粘在一起。

我同意这是一种软糖和次优。如果有人可以提出“正确”的答案,我会很感兴趣,但我认为它很简单,因为数据框不应该超过一定的大小。

Split a large pandas dataframe

【讨论】:

    【解决方案2】:

    直到在泡菜/熊猫方面的某个地方得到修复, 我想说更好的选择是使用替代 IO 后端。 HDF 适用于大型数据集 (GB)。所以你不需要添加额外的拆分/合并逻辑。

    df.to_hdf('my_filename.hdf','mydata',mode='w')
    
    df = pd.read_hdf('my_filename.hdf','mydata')
    

    【讨论】:

      【解决方案3】:

      尝试使用压缩。它对我有用。

      data_df.to_pickle('data_df.pickle.gzde', compression='gzip')

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,并将原因追溯到内存问题。根据this recourse 的说法,它通常实际上不是由内存本身引起的,而是过多的资源移动到交换空间中。通过使用命令(在该链接中提供)禁用所有交换,我能够保存大熊猫文件:

            swapoff -a
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-12
          • 2014-03-11
          • 1970-01-01
          • 1970-01-01
          • 2020-04-07
          • 2017-04-01
          • 2021-09-15
          相关资源
          最近更新 更多