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

5

我正在尝试创建一个函数,用于从 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已经创建好了。假设我有另一个数据框,我想用它来更新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?
谢谢, Elv
2个回答

3
最终,我自己找到了答案。在我的情况下,如果可以覆盖整个节点并且“combine_first”可以得到原始值和新值,则可以使用它。
store.put(key,value,table=True,append=False) 
替换为
store.append(key,value).

3

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

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

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

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

如有需要,请自由地提出将update作为增强问题。


事实上,那只是我的临时解决方案。感谢提供信息。 - Elvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接