Обновить pandas DataFrame, хранящийся в Pytable, с другим pandas DataFrame

Я пытаюсь создать функцию, которая обновляет сохраненный DataFrame pandas, который я сохранил в PyTable, новыми данными из DataFrame pandas. Я хочу проверить, отсутствуют ли некоторые данные в PyTable для определенных DatetimeIndexes (значение NaN или доступна новая метка времени), заменить это новыми значениями из данного кадра данных pandas и добавить это в Pytable. По сути, просто обновите Pytable. Я могу получить объединенный DataFrame, используя метод comb_first в Pandas. Ниже Pytable создается с фиктивными данными:

import pandas as pd
import numpy as np
import datetime as dt
index = pd.DatetimeIndex(start = dt.datetime(2001,1,1,0,0), periods = 20000,freq='10T')
data_in_pytable = pd.DataFrame(index=index,data=np.random.randn(20000,2),columns=['value_1','value_2'])
data.to_hdf(r'C:\pytable.h5','test',mode='r+',append=True,complevel=9,complib='zlib')

Итак, pytable создан. Предполагая, что у меня есть еще один кадр данных, с помощью которого я хочу обновить Pytable:

new_index = pd.DatetimeIndex(start = dt.datetime(2001,5,1,0,0), periods = 10000,freq='10T')
data_to_update=pd.DataFrame(index=new_index,data=np.random.randn(10000,2),columns=['value_1','value_2'])
store=pd.HDFStore(r'C:\pytable.h5',mode='r+',complevel=9,complib='zlib')
store.append('test',store.select('test').combine_first(data_to_update))
store.close()

Проблема в том, что PyTable сохраняет исходные значения, а не обновляет существующие. Теперь у меня есть повторяющиеся записи (по индексу), потому что исходные значения не перезаписываются.

Резюме: как я могу обновить PyTable с помощью другого DataFrame?

Спасибо, Эльв


person Elvin    schedule 10.06.2013    source источник


Ответы (2)


В настоящее время это не поддерживается. PyTables поддерживает метод update, но не реализован в pandas.

Самый простой способ — либо использовать mode='w' и записать новый файл, либо

store.remove(key); store.append(.....)

HDF5 не является «обычной» базой данных, и обновление не является обычной операцией, если вам нужен SQL, это может быть вариантом.

Не стесняйтесь запрашивать update как улучшение как проблему.

person Jeff    schedule 10.06.2013
comment
На самом деле, это было моим временным решением. Спасибо за информацию - person Elvin; 10.06.2013

В конце концов, я узнал это сам. В моем случае, когда можно перезаписать весь узел, поскольку «combine_first» дает вам исходные и новые значения, можно использовать

store.put(key,value,table=True,append=False) 

вместо

store.append(key,value).
person Elvin    schedule 10.06.2013