首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以更新HDFStore吗?

我可以更新HDFStore吗?
EN

Stack Overflow用户
提问于 2017-08-11 18:26:36
回答 1查看 1.9K关注 0票数 5

考虑下面的hdfstore和dataframes、dfdf2

代码语言:javascript
复制
import pandas as pd

store = pd.HDFStore('test.h5')
代码语言:javascript
复制
midx = pd.MultiIndex.from_product([range(2), list('XYZ')], names=list('AB'))
df = pd.DataFrame(dict(C=range(6)), midx)

df

     C
A B   
0 X  0
  Y  1
  Z  2
1 X  3
  Y  4
  Z  5
代码语言:javascript
复制
midx2 = pd.MultiIndex.from_product([range(2), list('VWX')], names=list('AB'))
df2 = pd.DataFrame(dict(C=range(6)), midx2)

df2

     C
A B   
0 V  0
  W  1
  X  2
1 V  3
  W  4
  X  5

我想先把df写到商店里。

代码语言:javascript
复制
store.append('df', df)

store.get('df')

     C
A B   
0 X  0
  Y  1
  Z  2
1 X  3
  Y  4
  Z  5

在稍后的时间点,我将有另一个数据,我想用更新商店。我想用与新的dataframe相同的索引值覆盖行,同时保留旧的数据。

当我这么做

代码语言:javascript
复制
store.append('df', df2)

store.get('df')

     C
A B   
0 X  0
  Y  1
  Z  2
1 X  3
  Y  4
  Z  5
0 V  0
  W  1
  X  2
1 V  3
  W  4
  X  5

这根本不是我想要的。注意,(0, 'X')(1, 'X')是重复的。我可以操作合并的数据格式和覆盖,但我希望在不可行的情况下处理大量数据。

我怎样更新商店才能得到?

代码语言:javascript
复制
     C
A B   
0 V  0
  W  1
  X  2
  Y  1
  Z  2
1 V  3
  W  4
  X  5
  Y  4
  Z  5

您将看到,对于每个级别的'A''Y'和'Z'是相同的,'V''W'是新的,'X'是更新的。

正确的方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-11 19:26:09

理念:首先从HDF中删除匹配行(具有匹配的索引值),然后将df2追加到HDFStore。

问题:我找不到一种将where="index in df2.index"用于多索引索引的方法。

解决方案:首先将多个索引转换为普通索引:

代码语言:javascript
复制
df.index = df.index.get_level_values(0).astype(str) + '_' + df.index.get_level_values(1).astype(str)

df2.index = df2.index.get_level_values(0).astype(str) + '_' + df2.index.get_level_values(1).astype(str)

这产生了:

代码语言:javascript
复制
In [348]: df
Out[348]:
     C
0_X  0
0_Y  1
0_Z  2
1_X  3
1_Y  4
1_Z  5

In [349]: df2
Out[349]:
     C
0_V  0
0_W  1
0_X  2
1_V  3
1_W  4
1_X  5

在创建/追加format='t'文件时,请确保使用了data_columns=Truedata_columns=True(这将在HDF5文件中索引保存索引和索引列,允许我们在where子句中使用它们):

代码语言:javascript
复制
store = pd.HDFStore('d:/temp/test1.h5')
store.append('df', df, format='t', data_columns=True)
store.close()

现在,我们可以首先使用匹配的索引从HDFStore中删除这些行:

代码语言:javascript
复制
store = pd.HDFStore('d:/temp/test1.h5')

In [345]: store.remove('df', where="index in df2.index")
Out[345]: 2

并附加df2

代码语言:javascript
复制
In [346]: store.append('df', df2, format='t', data_columns=True, append=True)

结果:

代码语言:javascript
复制
In [347]: store.get('df')
Out[347]:
     C
0_Y  1
0_Z  2
1_Y  4
1_Z  5
0_V  0
0_W  1
0_X  2
1_V  3
1_W  4
1_X  5
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45641665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档