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

Posted

技术标签:

【中文标题】使用另一个 pandas DataFrame 更新存储在 Pytable 中的 pandas DataFrame【英文标题】:Update pandas DataFrame in stored in a Pytable with another pandas DataFrame 【发布时间】:2013-06-05 22:30:42 【问题描述】:

我正在尝试创建一个函数,该函数使用来自 pandas DataFrame 的新数据更新存储在 PyTable 中的 pandas DataFrame。我想检查 PyTable 中是否缺少特定 DatetimeIndexes 的某些数据(值为 NaN 或新的时间戳可用),将其替换为给定 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?

谢谢, 精灵

【问题讨论】:

【参考方案1】:

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

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

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

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

请随时请求update 作为增强问题。

【讨论】:

事实上,这是我的临时解决方案。感谢您的信息【参考方案2】:

最后,我自己发现了。就我而言,当“combine_first”为您提供原始值和新值时可以覆盖整个节点时,可以使用

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

而不是

store.append(key,value).

【讨论】:

以上是关于使用另一个 pandas DataFrame 更新存储在 Pytable 中的 pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

((Python)pandas.DataFrame不在每个for循环周期中更新值,为什么?

使用部分映射更新 pandas DataFrame 的列

Pandas:查找不在另一个DataFrame中的DataFrame行[重复]

如何在pandas dataframe中为新列添加值?

识别另一个 pandas DataFrame 的视图或副本

pandas 怎么根据另一个dataframe来筛选