HDF +熊猫:我怎样才能使用带有多索引的where掩码?

时间:2015-07-11 13:55:05

标签: python pandas hdf5 pyhdf

我想从巨大的hdf5中逐日选择数据的一个子集。使用where mask会很完美,但我不能使用多索引(因为我必须有两个条件的地方)。不能使用带有多索引的where掩码:

import itertools
import pandas as pd
import numpy as np
a = ('A', 'B')
i = (0, 1, 2)
idx = pd.MultiIndex.from_tuples(list(itertools.product(a, i)),
                            names=('Alpha', 'Int'))
df = pd.DataFrame(np.random.randn(len(idx), 7), index=idx,
              columns=('I', 'II', 'III', 'IV', 'V', 'VI', 'VII'))

enter image description here

好的,现在我把它放在hdf商店

from pandas.io.pytables import HDFStore
store =HDFStore('cancella.h5', 'w')
store.append('df_mask',df)

但如果我再读一遍,我就

c = store.select_column('df_mask','index')
print c

这个错误的指数。

0    0
1    1
2    2
3    3
4    4
5    5
dtype: int64

所以我无法使用where mask。你能救我吗?

4 个答案:

答案 0 :(得分:0)

我想这是因为在将表放入linesFile[1]之前,pandas可能会reset_index(原因可能是它试图避免任何潜在的重复索引,这在数据帧中是允许的,但对数据库来说非常糟糕),并使用整数自动递增的主键作为HDF5表中的索引。因此,您在帖子中编写的代码会选择这些自动递增的主键。

可能还有其他更优雅的方法,但我发现了以下工作。 (如果pandas确实是HDF5的结果,那么现在多级索引就成了列......)

reset_index

enter image description here

答案 1 :(得分:0)

您是否尝试过使用Pandas to_hdf(安装pytables后)?

df.to_hdf('/Users/Alexander/Downloads/hdf.h5', key='data', format='t')

>>> pd.read_hdf('/Users/Alexander/Downloads/hdf.h5', 'data', columns='index')
Empty DataFrame
Columns: []
Index: [(A, 0), (A, 1), (A, 2), (B, 0), (B, 1), (B, 2)]

选择format ='t'选项:

  

“写为PyTables表结构,可能表现更差但允许   更灵活的操作,如搜索/选择子集   数据“

本文档提供了使用where掩码选择数据的详细信息。

答案 2 :(得分:0)

这可能与您的问题正交,但我没有在您的DataFrame中看到名为'index'的列或索引,因此我不知道您实际选择的是什么

c = store.select_column('df_mask','index')

我一直使用read_hdf包装器来处理PyTables并且发现它非常灵活。它的语法非常灵活,例如

c = pd.read_hdf('/home/Jian/Downloads/temp.h5', 'df_mask', where="Alpha='A' | Alpha='B' & Int=0")

您的where子句中的条件数量存在严格限制,但如果我已正确阅读您的问题,那么这将是您的第二个订单问题。

答案 3 :(得分:0)

在当前的熊猫版本0.24.2中,您可以使用直接查询而无需中间的MultiIndex检索:

idx = pd.MultiIndex.from_product([('A', 'B'), range(3)], names=('Alpha', 'Int'))
df = pd.DataFrame(np.random.randn(len(idx), 3), index=idx,
                  columns=('I', 'II', 'III'))
df

>>>                    I           II         III
>>> Alpha   Int             
>>>     A   0    0.547846   -1.630704    0.456686
>>>         1   -0.057442   -0.232721    0.349548
>>>         2    1.495230    0.661166    1.309862
>>>     B   0    2.116818    0.477923   -0.252352
>>>         1    1.001081    2.578723   -0.040782
>>>         2   -1.286964    0.357969    0.002976

只需使用内置的where掩码:

with pd.HDFStore('test.h5') as store:
    store.put('df_mask', df, format='t')
    store.select('df_mask', where = 'Alpha = A & Int in [0,2]')

>>>                         I          II        III
>>> Alpha   Int             
>>>     A     0      0.621453   -1.757883   0.494433
>>>           2     -0.689012   -1.254884   0.655424

对于在掩码访问docs中允许的不同功能。

但是,如果您想要的过滤器非常复杂,并且想要检索MultiIndex并“手动”构建蒙版,则可以像so那样选择它:

with pd.HDFStore('test.h5') as store:
    store.select('df_mask', columns=['index'])

>>> Alpha   Int
>>>     A     0
>>>           1
>>>           2
>>>     B     0
>>>           1
>>>           2