Ошибка при попытке сохранить строку hdf5, где один столбец является строкой, а другой - массивом с плавающей точкой - PullRequest
0 голосов
/ 02 мая 2019

У меня есть два столбца, один является строкой, а другой - массивом чисел с плавающей запятой

a = 'this is string'

b = np.array([-2.355,  1.957,  1.266, -6.913])

Я хотел бы сохранить их в виде отдельных столбцов в файле hdf5.Для этого я использую pandas

hdf_key = 'hdf_key'
store5 = pd.HDFStore('file.h5')

z = pd.DataFrame(
{
 'string': [a],
 'array': [b]
})
store5.append(hdf_key, z, index=False)
store5.close()

Однако я получаю эту ошибку

TypeError: Cannot serialize the column [array] because
its data contents are [mixed] object dtype

Есть ли способ сохранить это в h5?Если так, то как?Если нет, как лучше хранить данные такого рода?

1 Ответ

1 голос
/ 02 мая 2019

Я не могу помочь вам с пандами, но могу показать вам, как это сделать с pytables.По сути, вы создаете таблицу, ссылающуюся либо на numpy recarray, либо на dtype, который определяет смешанные типы данных.

Ниже приведен супер простой пример, демонстрирующий создание таблицы с 1 строкой и 4 числами с плавающей запятой.Затем он добавляет строки данных в таблицу.Он показывает 2 различных метода добавления данных:
1. Список кортежей (по 1 кортежу для каждой строки) - см. append_list
2. Нулевой повторный массив (с dtype, соответствующим определению таблицы) - см. simple_recarr в цикле for

Чтобы получить остальные аргументы для create_table(), прочитайте документацию по Pytables.Это очень полезно и должно отвечать на дополнительные вопросы.Ссылка ниже:
Pytables Руководство пользователя

import tables as tb
import numpy as np

with tb.open_file('SO_55943319.h5', 'w') as h5f:

    my_dtype = np.dtype([('A','S16'),('b',float),('c',float),('d',float),('e',float)])
    dset = h5f.create_table(h5f.root, 'table_data', description=my_dtype)

# Append one row using a list:
    append_list = [('test string', -2.355, 1.957, 1.266, -6.913)]
    dset.append(append_list)

    simple_recarr = np.recarray((1,),dtype=my_dtype)

    for i in range(5):

        simple_recarr['A']='string_' + str(i)
        simple_recarr['b']=2.0*i
        simple_recarr['c']=3.0*i
        simple_recarr['d']=4.0*i
        simple_recarr['e']=5.0*i

        dset.append(simple_recarr)

print ('done')
...