2013-07-11 3 views
3

Я получил все мои данные в HDFStore (да!), Но как его получить из него ..перебрать HDFStore с использованием экономии chunksize в новый HDFStore

Я сохранил 6 DataFrames как frame_table в моем HDFStore , Каждая из этих таблиц выглядит следующим образом, но длина меняется (дата - юлианская дата).

>>> a = store.select('var1') 
>>> a.head() 
         var1 
x_coor y_coor date   
928 310 2006257 133 
932 400 2006257 236 
939 311 2006257 253 
941 312 2006257 152 
942 283 2006257 68 

Тогда я выбираю из всех моих таблиц значения где дата например> 2006256.

>>> b = store.select_as_multiple(['var1','var2','var3','var4','var5','var6'], where=(pd.Term('date','>',date)), selector= 'var1') 
>>> b.head() 
         var1 var2 var3 var4 var5 var6 
x_coor y_coor date           
928 310 2006257 133 14987 7045 18 240 171 
       2006273 136  0 7327 30 253 161 
       2006289 125  0 -239 83 217 168 
       2006305 95 14604 6786 13 215 57 
       2006321 84  0 4548 13 133 88 

Это работает, но только для относительно небольших .h5 файлов. Поэтому для моих обычных файлов .h5 я хотел бы временно сохранить его в HDFStore с помощью chunksize (так как я должен добавить к нему новый столбец на основе этого выбора). Я думал, как это (с помощью this):

for df in store.select_as_multiple(['var1','var2','var3','var4','var5','var6'], where=(pd.Term('date','>',date)), selector= 'var1', chunksize=15): 
    tempstore.put('test',pd.DataFrame(df)) 

Но тогда только один кусок будет добавлен в хранилище. Но с:

tempstore.append('test',pd.DataFrame(df)) 

Я получаю ValueError: можно добавлять только в таблицы. Что я делаю неправильно?

ответ

5

Когда вы пытались сделать это с помощью put, он продолжал перезаписывать хранилище (с последним фрагментом), после чего вы получаете сообщение об ошибке при добавлении (потому что вы не можете добавить к столу/не таблице).

То есть:

  • put пишет один, без appendable фиксированного формата (так называемого storer), которая быстро писать, но вы не можете добавлять, ни запроса (только получить его в полном объеме).

  • append создает формат table, который вы хотите здесь (и что такое frame_table).

Примечание: вам не нужно делать pd.DataFrame(df), как df уже кадр.

Итак, первым сделать это (удалить хранилище), если его там:

if 'test' in tempstore: 
    tempstore.remove('test') 

Затем добавьте каждый DataFrame:

for df in store.select_as_multiple(.....): 
    tempstore.append('test', df) 
+0

Спасибо за этот ценный бит информации. Но я еще не решил свою ситуацию полностью. Так как он вызывает следующую ошибку: ValueError: недопустимый комбинатор [values_axes] при добавлении данных [name-> values_block_0, cname-> values_block_0, axis-> None, pos-> 1, kind-> float] vs current table [имя- > values_block_0, cname-> values_block_0, axis-> None, pos-> 1, kind-> integer] ' Мои данные int32, но он пытается сохранить его как float. Почему он не копирует структуру данных? – Mattijn

+0

Может ли у вас ссылка на ваши данные и ваш код для чтения/записи? – Jeff

+0

Что произойдет, если вы используете более крупный фрагмент? fyi default chunksize is 50k – Jeff

Смежные вопросы