ValueError: невозможно создать массив OBJECT из буфера памяти - PullRequest
0 голосов
/ 24 октября 2018

Поскольку во время конкатенации кадров данных pandas у меня возникла ошибка памяти, я решил записать кадры данных pandas в двоичный файл в режиме добавления, а затем прочитать этот двоичный файл, чтобы получить весь кадр данных.

Однако я получил' 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 голосов
/ 25 октября 2018

Я предполагаю, что вы используете Python 3, который по умолчанию обрабатывает всю строку как Unicode.И Юникод не так просто преобразовать в двоичный, просто потому, что длина одного символа может быть несколько байтов.

Итак, я думаю, вы должны взглянуть на этот пост:

Python: преобразовать строку в байтовый массив

, чтобы преобразовать ваши строковые данные в правильные двоичные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...