ValueError:无法从内存缓冲区创建对象数组

时间:2018-10-24 15:09:42

标签: python pandas dataframe memory valueerror

由于在连接熊猫数据帧时遇到内存错误,因此我决定以追加模式将熊猫数据帧写入二进制文件,然后读取此二进制文件以获取整个数据帧。

但是,我得到了' ValueError:无法从内存缓冲区创建OBJECT数组'

如果所有数据框都有数字列,则不会发生此问题。但是,如果其中一列是字符串(在我的情况下,我的数据帧中有很多字符串列),则会弹出此值错误。这是下面的代码来说明这种情况。取消注释#works1或#works2即可看到没有错误。但是使用#下的数据框不起作用会导致ValueError

import pandas as pd
import numpy as np

mtot=0

if os.path.exists('df_all.bin'):
    os.remove('df_all.bin')

for i in range(2):
    #works1
    # df = pd.DataFrame(np.random.randint(100, size=(5, 2)))

    #works2
    # df = pd.DataFrame({'A':[1,2,3], 'B':[1,2,3], 'C':[1.0,2.0,3.0]})
    # df = df.astype(dtype={'A': int, 'B': int, 'C': float})

    #does not work
    df = pd.DataFrame({'A':[1,2,3], 'B':['sample1','sample2','sample3'], 'C':[1.0,2.0,3.0]})
    df = df.astype(dtype={'A': int, 'B': str, 'C': float})

    typ = df.values.dtype
    print('dtype:%s' %typ)

    with open('df_all.bin', 'ab') as f:
        m, n = df.shape
        mtot += m
        f.write(df.values.tobytes())

with open('df_all.bin', 'rb') as f:
    buffer = f.read()
    nparray = np.frombuffer(buffer, dtype=typ)
    data = nparray.reshape(mtot, n)
    whole_df = pd.DataFrame(data=data, columns=list(range(n)))

print(whole_df)
print(whole_df.shape)

os.remove('df_all.bin')

如何摆脱此ValueError?

谢谢

1 个答案:

答案 0 :(得分:0)

我的猜测是您使用的是Python 3,默认情况下会将所有字符串都视为unicode。而且Unicode不容易转换为二进制,仅仅是因为单个字符的长度可能是多个字节。

所以,我认为您应该看一下这篇文章:

Python: convert string to byte array

将您的字符串数据转换为适当的二进制数据。