将熊猫写入HDF5时是否可以指定泡菜协议?

问题描述 投票:2回答:1

是否有办法告诉熊猫使用特定的泡菜协议(例如4)在写入HDF5文件时

这里是情况(已大大简化):

  • 客户端A使用python=3.8.1(以及pandas=1.0.0pytables=3.6.1)。 A使用df.to_hdf(file, key)写入一些DataFrame。

  • 客户端B使用python=3.7.1(并且碰巧是pandas=0.25.1pytables=3.5.2-但这无关紧要)。 B尝试使用pd.read_hdf(file, key)读取A写入的数据,并以ValueError: unsupported pickle protocol: 5失败。

请记住,使用纯数字形式的DataFrame不会发生这种情况(例如pd.DataFrame(np.random.normal(size=(10,10)))。因此,这是一个可重现的示例:

(base) $ conda activate py38
(py38) $ python
Python 3.8.1 (default, Jan  8 2020, 22:29:32)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> df = pd.DataFrame(['hello', 'world']))
>>> df.to_hdf('foo', 'x')
>>> exit()
(py38) $ conda deactivate
(base) $ python
Python 3.7.4 (default, Aug 13 2019, 20:35:49)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> df = pd.read_hdf('foo', 'x')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 407, in read_hdf
    return store.select(key, auto_close=auto_close, **kwargs)
  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 782, in select
    return it.get_result()
  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 1639, in get_result
    results = self.func(self.start, self.stop, where)
  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 766, in func
    return s.read(start=_start, stop=_stop, where=_where, columns=columns)
  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 3206, in read
    "block{idx}_values".format(idx=i), start=_start, stop=_stop
  File "/opt/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 2737, in read_array
    ret = node[0][start:stop]
  File "/opt/anaconda3/lib/python3.7/site-packages/tables/vlarray.py", line 681, in __getitem__
    return self.read(start, stop, step)[0]
  File "/opt/anaconda3/lib/python3.7/site-packages/tables/vlarray.py", line 825, in read
    outlistarr = [atom.fromarray(arr) for arr in listarr]
  File "/opt/anaconda3/lib/python3.7/site-packages/tables/vlarray.py", line 825, in <listcomp>
    outlistarr = [atom.fromarray(arr) for arr in listarr]
  File "/opt/anaconda3/lib/python3.7/site-packages/tables/atom.py", line 1227, in fromarray
    return six.moves.cPickle.loads(array.tostring())
ValueError: unsupported pickle protocol: 5
>>>

注意:我也尝试在pandas=1.0.0中使用pytables=3.6.1(和python=3.7.4)进行阅读。那也失败了,所以我相信是导致该问题的仅仅是Python版本(3.8 writer与3.7 reader)。这是有道理的,因为pickle协议5是作为Python 3.8的PEP-574引入的。

python pandas hdf5 python-3.8
1个回答
0
投票

我正面临着同样的问题...我“知道”如何解决这个问题,我想你也...解决方案是将整个数据重新处理为泡菜(或csv),然后在python3.7中将其重新转换为hdf5(仅知道协议4)。

流程是这样的:python3.8-> hdf5-> python3.8-> csv / pickle-> python3.7-> hdf5(与两个版本兼容)

我避免了这条路线,因为我导出了数据框的大量数据,从而创建了大量文件。

您实际上限制使用python3.7吗?我受到tensorflow的限制,它目前仅支持3.7(正式),但是您可以安装tensorflow-nightly-build,它可以与python 3.8一起使用

检查您是否可以升级到3.8,这肯定会解决您的问题。 :)

© www.soinside.com 2019 - 2024. All rights reserved.