Как объединить несколько фреймов данных pandas в объект HDF5 под одним ключом / группой?

Я разбираю данные из большого CSV размером 800 ГБ. Для каждой строки данных я сохраняю это как фрейм данных pandas.

readcsvfile = csv.reader(csvfile)
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
    # save as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])

Теперь я хотел бы сохранить это в формате HDF5 и запросить h5, как если бы это был весь файл csv.

import pandas as pd
store = pd.HDFStore("pathname/file.h5")

hdf5_key = "single_key"

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]

До сих пор мой подход был таков:

import pandas as pd
store = pd.HDFStore("pathname/file.h5")

hdf5_key = "single_key"

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
    # save as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])
    store.append(hdf5_key, df, data_columns=csv_columns, index=False)

То есть я пытаюсь сохранить каждый фрейм данных df в HDF5 под одним ключом. Однако это не удается:

  Attribute 'superblocksize' does not exist in node: '/hdf5_key/_i_table/index'

Итак, я мог бы сначала попытаться сохранить все в одном фрейме данных pandas, т.е.

import pandas as pd
store = pd.HDFStore("pathname/file.h5")

hdf5_key = "single_key"

csv_columns = ["COL1", "COL2", "COL3", "COL4",..., "COL55"]
readcsvfile = csv.reader(csvfile)
total_df = pd.DataFrame()
for i, line in readcsvfile:
    # parse create dictionary of key:value pairs by csv field:value, "dictionary_line"
    # save as pandas dataframe
    df = pd.DataFrame(dictionary_line, index=[i])
    total_df = pd.concat([total_df, df])   # creates one big CSV

и теперь сохраняем в формате HDF5

    store.append(hdf5_key, total_df, data_columns=csv_columns, index=False)

Однако я не думаю, что у меня есть ОЗУ / хранилище для сохранения всех строк csv в total_df в формате HDF5.

Итак, как мне добавить каждый «однострочный» df в HDF5, чтобы он получился одним большим фреймом данных (как исходный csv)?

РЕДАКТИРОВАТЬ: Вот конкретный пример файла csv с разными типами данных:

 order    start    end    value    
 1        1342    1357    category1
 1        1459    1489    category7
 1        1572    1601    category23
 1        1587    1599    category2
 1        1591    1639    category1
 ....
 15        792     813    category13
 15        892     913    category5
 ....

person ShanZhengYang    schedule 07.10.2016    source источник
comment
Даже все записи одного типа? IRC, hdf5 не создает смешанные массивы.   -  person Paul Brodersen    schedule 08.10.2016
comment
@Paul Ну, а как вы поместите все данные csv + TB в формат HDF5?   -  person ShanZhengYang    schedule 08.10.2016
comment
@MaxU Я знаю, что вы эксперт по HDF5. Это возможно? Это кажется очень простой задачей ...   -  person ShanZhengYang    schedule 08.10.2016
comment
@Paul Должен ли я создавать отдельные столбцы для каждого поля csv COL1, COL2, .. и добавлять туда значения из словаря / из фрейма данных pandas? Как мне поступить со значениями NaN? Что вы рекомендуете?   -  person ShanZhengYang    schedule 08.10.2016
comment
@ Ümit Вы также являетесь известным экспертом по HDF5 по StackOverlow. Конечно, это простая задача, не так ли? Должен ли я как-то сохранять каждое из значений поля в отдельные массивы, а затем сохранять в HDF5? (Я не знаю, сохранит ли это структуру кадра данных csv, и я беспокоюсь, что столкнусь с проблемами ОЗУ, сохраняя огромные массивы перед сохранением в HDF5 ...)   -  person ShanZhengYang    schedule 08.10.2016
comment
вы можете показать несколько строк файла csv?   -  person HYRY    schedule 08.10.2016
comment
@HYRY Я добавил выше пример csv с несколькими столбцами и разными типами данных.   -  person ShanZhengYang    schedule 08.10.2016
comment
Почему бы вам не использовать pandas.read_csv() с аргументом chunksize?   -  person HYRY    schedule 09.10.2016
comment
@HYRY Мне нужно хорошенько очистить каждую строку. Вот почему я тщательно разбираю это (не все детали показаны выше для ясности - технически это данные с разделителями табуляции, а не совсем очищенный файл csv). Давайте попробуем следующее: как проще всего воспроизвести то, что делает pandas.read_csv(), и сохранить проанализированные строки csv в HDF5 по частям? Вы разбираете 10 000 строк, сохраняете в HDF5 под одной группой / ключом и продолжаете.   -  person ShanZhengYang    schedule 09.10.2016
comment
store.append() должно работать, можете ли вы опубликовать тестовые данные и тестовый код, чтобы воспроизвести проблему?   -  person HYRY    schedule 09.10.2016
comment
@HYRY Это должен быть третий блок кода выше. Я получаю сообщение об ошибке Attribute 'superblocksize' does not exist in node: '/hdf5_key/_i_table/index'   -  person ShanZhengYang    schedule 09.10.2016


Ответы (1)


Ваш код должен работать, вы можете попробовать следующий код:

import pandas as pd
import numpy as np

store = pd.HDFStore("file.h5", "w")
hdf5_key = "single_key"
csv_columns = ["COL%d" % i for i in range(1, 56)]
for i in range(10):
    df = pd.DataFrame(np.random.randn(1, len(csv_columns)), columns=csv_columns)
    store.append(hdf5_key, df,  data_column=csv_columns, index=False)
store.close()

Если код работает, значит, с вашими данными что-то не так.

person HYRY    schedule 10.10.2016
comment
Этот код действительно работает, но я не уверен, что может быть не так с моими данными. Я получаю две ошибки: Attribute 'superblocksize' does not exist in node: '/hdf5_key/_i_table/index' или ValueError: cannot match existing table structure for [COLl1, COL2, COL3, COL4, COL5, ...] on appending data - person ShanZhengYang; 10.10.2016
comment
На самом деле причина, по которой этот пример работает, а мой выдает ошибку ValueError: cannot match existing table structure for [COLl1, COL2, COL3, COL4, COL5, ...] on appending data, заключается в том, что мои данные имеют несколько типов. Как бы вы сделали это, если бы столбцы df содержали строки, целые числа, числа с плавающей запятой и т. Д.? - person ShanZhengYang; 10.10.2016
comment
@ShanZhengYang Если у вас есть столбец со строкой и числами, сначала преобразуйте все значения в строку или число. - person HYRY; 10.10.2016