我想从巨大的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'))
好的,现在我把它放在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。你能救我吗?
答案 0 :(得分:0)
我想这是因为在将表放入linesFile[1]
之前,pandas可能会reset_index
(原因可能是它试图避免任何潜在的重复索引,这在数据帧中是允许的,但对数据库来说非常糟糕),并使用整数自动递增的主键作为HDF5
表中的索引。因此,您在帖子中编写的代码会选择这些自动递增的主键。
可能还有其他更优雅的方法,但我发现了以下工作。 (如果pandas确实是HDF5
的结果,那么现在多级索引就成了列......)
reset_index
答案 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