我用 Python 2.7 编写了一个数据帧,但现在我需要在 Python 3.6 中打开它,反之亦然(我想比较用两个版本编写的两个数据帧)。
如果我在 Python 3.6 中使用 pandas 打开 Python2.7 生成的 HDF 文件,则会产生以下错误:
UnicodeDecodeError:“ascii”编解码器无法解码位置 1 中的字节 0xde:序号不在范围内(128)
如果我在 Python 2.7 中使用 pandas 打开 Python3.6 生成的 HDF 文件,则会出现以下错误:
ValueError:不支持的pickle协议(protocol):4
对于这两种情况,我只是通过 df.to_hdf 保存文件。
有人知道如何解决这个问题吗?
最佳答案
如果原始数据帧的某些列包含列表或字典,则转换为 CSV(由 @irenemeanspeace 提议)将不起作用。
我找到了一种解决方法,可以处理列表和字典等简单对象。 在py27中转为json,然后从py3.6中读取。
# Run this in py2.7
###################################################
import pandas as pd
# read dataframe in py2.7
path = 'df.hdf5' # path to dataframe saved in py2.7
df = pd.read_hdf(path)
json_string = pd.to_json(compression='gzip')
with open('df.json.gz', 'w') as fp:
fp.write(json_string)
###################################################
# Now run in py3.6
###################################################
import pandas as pd
with open('df.json.gz', 'r') as fp:
json_string = fp.read()
df = pd.read_json(json_string)
这是更通用的解决方案。
关于python - 如何在 Python 3.6 中读取/转换包含用 Python 2.7 编写的 pandas 数据帧的 HDF 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49108596/