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...