Итеративно добавлять pandas фреймы данных в одной группе в файл h5 - PullRequest
1 голос
/ 03 апреля 2020

У меня есть небольшой скрипт, предназначенный для чтения CSV-файлов из пользовательского каталога ввода и преобразования их в один файл HDF5:

path = input('Insert the directory path:')

file_list = []
for file in glob.glob(path):
    file_list.append(file)


for filename in file_list:
    df = pd.read_csv(filename)
    key = Path(filename).resolve().stem
    with pd.HDFStore('test.h5') as store:
        store.append(key=key, value=df, format='table', data_columns=df.columns)

В настоящее время выполняется добавление каждого файла (в формате данных) как группа. Если я открою его в vitables, он будет выглядеть примерно так:

enter image description here

Кроме того, если я снова запустите скрипт, используя другой каталог, он продолжит добавлять новые групп (по одной для каждого файла) в группу root.

Что бы мне хотелось, чтобы каждый раз, когда я запускаю скрипт, он добавляет группы файлов в новую группу (тему) в root. Примерно так:

enter image description here

Мне кажется, это как-то связано с ключами, которые я передаю в store.append, потому что сейчас он использует имя файла в качестве ключа. Мне удалось вручную передать ключи и добавить нужный кадр данных, но это не конечная цель, которую я хотел.

Несколько советов было бы здорово! Спасибо

1 Ответ

1 голос
/ 03 апреля 2020
import glob
import os
import pandas as pd

# inputs
path = input('Insert the directory path:')
group = input('Insert a group name: ')

# create a list of file paths
file_list = [file for file in glob.glob(path)]
# dict comprehension to create keys from file name and values from the csv files
dfs = {os.path.basename(os.path.normpath(filename)).split('.')[0]: pd.read_csv(filename) for filename in file_list}

# loop though the dataframes
for k,df in dfs.items():
    # store the HDF5 file
    store = pd.HDFStore('test.h5')
    # append df to a group and assign the key with f-strings
    store.append(f'{group}/{k}', df, format='table', data_columns=df.columns)
    # close the file
    store.close()

Я выполнил приведенный выше код дважды один раз для группы sample и группы sample1 Ниже приведены результаты:

import h5py
# load file
f = h5py.File('test.h5', 'r')
print(f['sample'].keys())
print(f['sample1'].keys())
f.close()

<KeysViewHDF5 ['untitled', 'untitled1']>
<KeysViewHDF5 ['untitled2', 'untitled3']>

enter image description here

...