Pandas read_hdf: как получить имена столбцов при использовании chunksize или итератора?

Я читаю в большой (~10 ГБ) hdf5 таблице с pandas.read_hdf. Я использую iterator=True, чтобы я мог получить доступ к чанкам за раз (например, chunksize=100000 строк за раз).

Как получить список всех имен столбцов или "ключей"?

Кроме того, почему нет метода get_chunk, аналогичного методу для pandas.read_table? Является ли прямая итерация по чанкам единственным способом ("для чанка в данных: "), и вы не можете получить доступ к различным пронумерованным чанкам по желанию ("data[300]")?

Редактировать:

Похоже, я могу получить доступ к именам столбцов с помощью цикла, который прерывается после доступа к первому чанку:

for i,v in enumerate(data):
if i != 0:
    break
colnames = v.columns

Но тогда мой второй вопрос все еще остается: нет ли способа получить доступ к каждому отдельному чанку в итераторе TextFileReader панд (например, имитируя метод get_chunk read_table или с помощью поиска в стиле dict, data[0]) вместо выполнения выше странная одиночная итерация для цикла?

1 ответ

Решение

Вы пытались загрузить файл HDF5 как HDFStore? Это позволит вам использовать HDFStore.select метод, который может делать то, что вы хотите (с поиском и т. д.). Ты можешь использовать select работать только на подмножестве столбцов тоже. Для меня это выглядит так, как будто это обеспечивает большую гибкость, чем read_hdf функция. Следующее может помочь, если вы знаете структуру файла HDF5:

store = pd.HDFStore('/path/to/file', 'r')
colnames = store.select('table_key', stop=1).columns

# iterate over table chunks
chunksize = 100000
chunks = store.select('table_key', chunksize=chunksize)
for chunk in chunks:
    ...code...

# select 1 specific chunk as iterator
chunksize = 100000
start, stop = 300*chunksize, 301*chunksize
this_chunk = store.select('table_key', start=start, stop=stop, iterator=True)
do_work(this_chunk)

store.close()

Обратите внимание, что вы также можете открыть HDFStore в качестве диспетчера контекста, например,

with pd.HDFStore('/path/to/file', 'r') as store:
    ...code...
Другие вопросы по тегам