Python 2.7: добавление данных в таблицу в Pandas

Я читаю данные из файлов изображений и хочу добавить эти данные в один файл HDF. Вот мой код:

datafile = pd.HDFStore(os.path.join(path,'imageData.h5'))
for file in fileList: 
     data = {'X Position' :  pd.Series(xpos, index=index1),
             'Y Position' :  pd.Series(ypos, index=index1),
             'Major Axis Length' :  pd.Series(major, index=index1),
             'Minor Axis Length' :  pd.Series(minor, index=index1), 
             'X Velocity' :  pd.Series(xVelocity, index=index1),
             'Y Velocity' :  pd.Series(yVelocity, index=index1) }
    df = pd.DataFrame(data)
    datafile['df'] = df
    datafile.close()

Очевидно, что это неверно, так как при каждом запуске цикла каждый набор данных перезаписывается новым.

Если вместо datafile['df'] = df я использую

datafile.append('df',df)    

OR

df.to_hdf(os.path.join(path,'imageData.h5'), 'df', append=True, format = 'table')

Я получаю сообщение об ошибке:

ValueError: Can only append to Tables

Я ссылался на документацию и другие SO вопросы, безрезультатно.

Итак, я надеюсь, что кто-то может объяснить, почему это не работает и как я могу успешно добавить все данные в один файл. Я готов использовать другой метод (возможно, pyTables), если это необходимо.

Любая помощь будет принята с благодарностью.


person salamander    schedule 26.02.2014    source источник
comment
Второй способ (df.to_hdf(..., format="table", append=True)) на самом деле правильный. Вы пробовали использовать это (без всего HDFStore) со свежим файлом?   -  person filmor    schedule 26.02.2014
comment
@filmor Вы имеете в виду удалить строку, в которой я создаю пустой файл HDF? Пробовал, та же ошибка. Может быть, проблема в том, что данные находятся в DataFrame, а не в таблице?   -  person salamander    schedule 26.02.2014
comment
Нет, сообщение об ошибке относится к используемому внутреннему формату таблицы HDF5. IIRC в более старых версиях панд (кстати, какую из них вы используете?) HDFStore по умолчанию использовал формат fixed, который не позволяет добавлять. Формат table используется PyTables.   -  person filmor    schedule 26.02.2014
comment
Версия 0.11.0 - я пробовал на новом файле, и он работал, но без цикла for.   -  person salamander    schedule 26.02.2014
comment
@filmor Итак, согласно тому, что вы сказали, я должен вместо этого использовать PyTables? Или функция to_hdf должна разрешать добавление?   -  person salamander    schedule 26.02.2014
comment
Если вы используете format="table" to_hdf, следует разрешить добавление с помощью PyTables внутри, нет необходимости делать это самостоятельно. Однако вы можете обновить pandas. Что значит и это сработало? Не могли бы вы обновить вопрос?   -  person filmor    schedule 26.02.2014
comment
в 0.11 to_hdf не пропускал ключевые слова, так что это не сработает. лучше обновить - текущая версия 0.13.1   -  person Jeff    schedule 26.02.2014
comment
@Джефф, я обновился до 0.13.0. Метод to_hdf теперь тоже работает.   -  person salamander    schedule 27.02.2014


Ответы (1)


Это будет работать в версии 0.11. Как только вы создадите группу (например, метку, на которой вы храните данные, здесь «df»). Если вы сохраните формат fixed, он будет перезаписан (и если вы попытаетесь добавить, вы получите указанное выше сообщение об ошибке); если вы пишете в формате table, вы можете добавить. Обратите внимание, что в версии 0.11 to_hdf неправильно передает ключевые слова базовой функции, поэтому вы можете использовать ее ТОЛЬКО для записи в формате fixed.

datafile = pd.HDFStore(os.path.join(path,'imageData.h5'),mode='w')
for file in fileList: 
     data = {'X Position' :  pd.Series(xpos, index=index1),
             'Y Position' :  pd.Series(ypos, index=index1),
             'Major Axis Length' :  pd.Series(major, index=index1),
             'Minor Axis Length' :  pd.Series(minor, index=index1), 
             'X Velocity' :  pd.Series(xVelocity, index=index1),
             'Y Velocity' :  pd.Series(yVelocity, index=index1) }
    df = pd.DataFrame(data)
    datafile.append('df',df)
datafile.close
person Jeff    schedule 26.02.2014
comment
Отлично спасибо. Единственное изменение, которое мне пришлось сделать, это добавить datafile.open() перед добавлением. - person salamander; 27.02.2014
comment
Для ясности, единственная разница здесь заключается в добавлении mode='w' в первой строке. В таком случае, каков режим по умолчанию? - person salamander; 27.02.2014
comment
режим по умолчанию — добавление (к файлу); w создает новый файл - person Jeff; 27.02.2014