由于在连接熊猫数据帧时遇到内存错误,因此我决定以追加模式将熊猫数据帧写入二进制文件,然后读取此二进制文件以获取整个数据帧。
但是,我得到了' 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?
谢谢
答案 0 :(得分:0)
我的猜测是您使用的是Python 3,默认情况下会将所有字符串都视为unicode。而且Unicode不容易转换为二进制,仅仅是因为单个字符的长度可能是多个字节。
所以,我认为您应该看一下这篇文章:
Python: convert string to byte array
将您的字符串数据转换为适当的二进制数据。