Прочитайте HDF - Работа с иерархией через Pandas

Я хотел бы прочитать файл hdf5 2D_rdb_NA_NA.h5. В файле есть родительские группы: 000000010002 и т. д. У каждой родительской группы есть дочерние группы data и grid.

Вот что я пытался до сих пор:

import h5py
import pandas as pd

data = h5py.File('2D_rdb_NA_NA.h5', 'r')
print(list(data.keys()))
['0000', '0001', '0002', '0003', '0004', '0005', '0006', '0007', '0008', '0009', '0010', ...
print(list(data['0000'].keys()))
['data', 'grid']
data['0000']['data']
<HDF5 dataset "data": shape (101, 128, 128, 1), type "<f4">
df = pd.read_hdf('2D_rdb_NA_NA.h5', key='0000')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[11], line 1
----> 1 df = pd.read_hdf('2D_rdb_NA_NA.h5', '0000')

File ~/lib/python3.10/site-packages/pandas/io/pytables.py:442, in read_hdf(path_or_buf, key, mode, errors, where, start, stop, columns, iterator, chunksize, **kwargs)
    437                 raise ValueError(
    438                     "key must be provided when HDF5 "
    439                     "file contains multiple datasets."
    440                 )
    441         key = candidate_only_group._v_pathname
--> 442     return store.select(
    443         key,
    444         where=where,
    445         start=start,
    446         stop=stop,
    447         columns=columns,
    448         iterator=iterator,
    449         chunksize=chunksize,
    450         auto_close=auto_close,
    451     )
    452 except (ValueError, TypeError, KeyError):
    453     if not isinstance(path_or_buf, HDFStore):
    454         # if there is an error, close the store if we opened it.
...
   1679         )
   1680 else:
   1681     if isinstance(value, Series):

TypeError: cannot create a storer if the object is not existing nor a value are passed

df = pd.read_hdf('2D_rdb_NA_NA.h5', key='0000/data') возвращает ту же ошибку. Если для этого невозможно использовать Pandas, придется использовать решение h5py.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, у вас есть небольшая ошибка в определении ключа. PyTables (пакет, который Pandas использует для чтения данных HDF5) требует определенного пути, начинающегося с «/». Попробуй это:

df_d = pd.read_hdf('2D_rdb_NA_NA.h5', key='/0000/data') # include the leading /    
df_g = pd.read_hdf('2D_rdb_NA_NA.h5', key='/0000/grid') # same

Я получаю ту же ошибку: TypeError: cannot create a storer if the object is not existing nor a value are passed

user572780 14.04.2023 12:22

Я также внес небольшую правку в свой вопрос: data['0000']['data'] возвращает <HDF5 dataset "data": shape (101, 128, 128, 1), type "<f4">. Возможно, это даст больше информации.

user572780 14.04.2023 12:24

Да, я создал несколько тестовых файлов для сравнения файлов из pandas и h5py. Потом я ошибся при тестировании pd.read_hdf() с каждым файлом, и пришел к неверному выводу выше. Смотрите новый ответ ниже.

kcw78 14.04.2023 14:34
Ответ принят как подходящий

Я думаю, проблема в том, что ваш файл HDF5 не был создан с помощью Pandas (и Pandas ожидает, что определенный формат/схема будет читать файлы h5). Я создал 2 тестовых файла, чтобы продемонстрировать разницу на основе пакета, использованного для создания файла. Код для создания двух файлов находится в конце.

Начните с опроса файла HDF5 с помощью метода .info() из pandas.HDFStore API. См. ниже:

with pd.HDFStore('SO_76007953_pd.h5') as h5_store:
    print(h5_store.info())

Это создаст МНОГО вывода, если файл был создан с помощью Pandas. Вывод для файла, который я создал с помощью Pandas:

<class 'pandas.io.pytables.HDFStore'>
File path: SO_76007953_pd.h5
/0000/data            frame_table  (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0000/grid            frame_table  (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0001/data            frame_table  (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0001/grid            frame_table  (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0002/data            frame_table  (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])
/0002/grid            frame_table  (typ->appendable,nrows->10,ncols->1,indexers->[index],dc->[])

Однако, если он НЕ был создан с помощью Pandas, вы получите очень мало вывода. Вывод для файла, созданного с помощью h5py:

<class 'pandas.io.pytables.HDFStore'>
File path: SO_76007953.h5
Empty

Если ваш файл был создан с помощью Pandas, вы сможете прочитать наборы данных со следующим:

df_d = pd.read_hdf('SO_76007953_pd.h5', key='/0000/data')
df_g = pd.read_hdf('SO_76007953_pd.h5', key='/0000/grid')

Однако, основываясь на ваших комментариях, я ожидаю, что вы получите «Пустой» при проверке файла h5. Вот почему pd.read_hdf() не работает. Если это так, вам нужно использовать другой пакет (h5py или PyTables, также известный как tables).

Вот короткий фрагмент кода, показывающий, как открыть файл с помощью h5py, перебрать группы и прочитать наборы данных data и grid либо в объект набора данных h5py, либо в массив numpy.

with h5py.File('2D_rdb_NA_NA.h5') as h5f:
    for g_name, g_obj in h5f.items():
        print(g_name) 
        data_ds = g_obj['data']  # this returns a h5py dataset object
        data_arr = g_obj['data'][()]  # this returns a numpy object
        grid_ds = g_obj['grid']
        grid_arr = g_obj['grid'][()]

Вот код для создания 2 файлов HDF5, 1 с Pandas и другой с h5py. Запустите их оба, затем проверьте с помощью HDFView. Когда вы это сделаете, вы увидите несколько отличий.

  1. Ключи grid и data в файле Pandas будут группами (а не наборами данных), а данные будут в группах и наборах данных под каждым ключом/группой.
  2. Файл Pandas также будет иметь множество атрибутов: 4 на корневом уровне и 15 для каждого ключа/группы данных сетки.

Код для создания с Pandas:

for i in range(3):
    df_g = pd.DataFrame( [(v+10*i) for v in range(10)] )  
    df_d = pd.DataFrame( [(v/10.+10*i) for v in range(10) ] )
    grp = f'{i:04d}'
    df_g.to_hdf('SO_76007953_pd.h5', key=grp+'/grid', mode='a', format='table')  
    df_d.to_hdf('SO_76007953_pd.h5', key=grp+'/data', mode='a', format='table')

Код для создания с помощью h5py:

with h5py.File('SO_76007953.h5','w') as h5f:
    for i in range(3):
        grp = h5f.create_group(f'{i:04d}')
        grp.create_dataset('grid', data=[ (v+10*i) for v in range(10)] )        
        grp.create_dataset('data', data=[ (v/10.+10*i) for v in range(10)])        

Другие вопросы по теме