使用另一个pandas DataFrame更新存储在Pytable中的pandas DataFrame

时间:2013-06-10 09:44:30

标签: python pandas hdf5 pytables dataframe

我正在尝试使用来自pandas DataFrame的新数据创建一个更新存储在PyTable中的pandas DataFrame的函数。我想检查PyTable中是否缺少特定DatetimeIndexes的某些数据(值为NaN或新的Timestamp可用),将其替换为给定pandas DataFrame中的新值,并将其附加到Pytable。基本上,只需更新Pytable。我可以使用Pandas中的combine_first方法获取组合的DataFrame。 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。假设我有另一个dataFrame,我想用它来更新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保留原始值,不更新现有值。我现在有重复的条目(按索引),因为原始值不会被覆盖。

要点: 如何使用其他DataFrame更新PyTable?

谢谢, 弱电

2 个答案:

答案 0 :(得分:4)

最后,我发现了自己。在我的情况下,当可以覆盖整个节点,因为“combine_first”可以获得原始值和新值',可以使用

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

而不是

store.append(key,value).

答案 1 :(得分:2)

目前不支持此功能。 PyTables支持update方法,但未在pandas中实现。

最简单的方法是使用mode='w'并编写新文件或

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

HDF5不是“常规”数据库,如果您需要SQL可能是一个选项,则更新不是常见操作。

随意请求update作为问题的增强功能。