Python(熊猫):使用多索引在hdf5中存储数据帧

Python(熊猫):使用多索引在hdf5中存储数据帧,python,sql,pandas,hdf5,multi-index,Python,Sql,Pandas,Hdf5,Multi Index,我需要使用具有多索引的大维度数据帧,因此我尝试创建一个数据帧来学习如何将其存储在hdf5文件中。 数据框如下所示:(前两列中有多个索引) 我正在使用pandas.to_hdf,但当我尝试选择组中的数据时,它会创建一个“固定格式存储”: store.select('table','Symbol == "A"') 它返回一些错误,主要问题是 TypeError: cannot pass a where specification when reading from a Fixed format s

我需要使用具有多索引的大维度数据帧,因此我尝试创建一个数据帧来学习如何将其存储在hdf5文件中。 数据框如下所示:(前两列中有多个索引)

我正在使用pandas.to_hdf,但当我尝试选择组中的数据时,它会创建一个“固定格式存储”:

store.select('table','Symbol == "A"')
它返回一些错误,主要问题是

TypeError: cannot pass a where specification when reading from a Fixed format store. this store must be selected in its entirety
然后我尝试像这样附加数据帧:

store.append('ts1',timedata)
这应该会创建一个表,但这给了我另一个错误:

TypeError: [unicode] is not implemented as a table column
因此,我需要代码以hdf5格式将数据帧存储在一个表中,并从单个索引中选择数据(为此,我找到了以下代码:
store.select('timedata','Symbol==“a”)

以下是一个示例

In [8]: pd.__version__
Out[8]: '0.14.1'

In [9]: np.__version__
Out[9]: '1.8.1'

In [10]: import sys

In [11]: sys.version
Out[11]: '2.7.3 (default, Jan  7 2013, 09:17:50) \n[GCC 4.4.5]'

In [4]: df = DataFrame(np.arange(9).reshape(9,-1),index=pd.MultiIndex.from_product([list('abc'),date_range('20140721',periods=3)],names=['symbol','date']),columns=['value'])

In [5]: df
Out[5]: 
                   value
symbol date             
a      2014-07-21      0
       2014-07-22      1
       2014-07-23      2
b      2014-07-21      3
       2014-07-22      4
       2014-07-23      5
c      2014-07-21      6
       2014-07-22      7
       2014-07-23      8

In [6]: df.to_hdf('test.h5','df',mode='w',format='table')

In [7]: pd.read_hdf('test.h5','df',where='date=20140722')
Out[7]: 
                   value
symbol date             
a      2014-07-22      1
b      2014-07-22      4
c      2014-07-22      7

In [12]: pd.read_hdf('test.h5','df',where='symbol="a"')
Out[12]: 
                   value
symbol date             
a      2014-07-21      0
       2014-07-22      1
       2014-07-23      2

杰夫的答案完全正确。我发现了一些我想分享的东西,它不适合评论——请考虑这只是一个长形式的附加评论:

(Pytables版本) 如果在尝试写入hdf文件时出现缺少属性或方法错误,则可能需要尝试更新PyTables版本。Pandas(在撰写本文时)利用了Pytables,我发现至少有一对版本抛出了一些奇怪的错误,直到我更新Pytables并重新加载

(数据类型) 这在Python3中可能已修复,但在2.7x中,to_hdf在unicode、混合数据类型列和浮点NaN值方面存在问题。下面是一个示例实用程序函数,用于清理数据帧,为写入为我修复所有这些问题的_hdf做准备。请注意,这将NaN替换为零,这适用于我的应用程序,但您可能需要调整:

hdf(数据)的def清洁冷却液: types=data.apply(lambda x:pd.lib.infere\u dtype(x.values)) 对于类型[types=='mixed']中的列。索引: 数据[col]=.data[col].astype(str) 数据[].fillna(0,原地=真)
返回数据请报告您的pandas版本、numpy版本、python版本、操作系统,并说明您是如何创建该框架的。pandas 0.14.1、numpy 1.8.1系统版本2.7.7 | Anaconda 2.0.1(x86_64)|(默认值,2014年6月2日,12:48:16)\n[GCC 4.0.1(苹果公司构建5493)]我用随机数据、随机符号和随机数量创建了一个sqlite3数据框,从中提取数据,创建了这个数据框:
doubleIndex=c.execute(“选择日期、符号、库存数量”)double=c.fetchall()serie=pandas.DataFrame(double,columns=['date','symbol','DateValue'])serie['date日期']=pandas.to_datetime(serie['Date'])serie=serie.sort('Date',升序=True)
这就是我创建多索引的方式:
index=pandas.MultiIndex.from_数组([serie['Symbol'],serie['Date']],name=['Symbol','Date])
您可能有unicode,请尝试
df[column]=df[column].astype(str
将unicode更改为字符串。无法在py2.7中存储unicode。您还应该使用
read\u sql
(并可能关闭sqlite3中的unicode选项),这将填充Na,但不会处理unicodeissue@MonicaHeddneck-你有没有试着发现没有?修复unicode是我代码中的.astype(str)的目的,至少当我现在尝试一些简单的示例时,它可以在Python2.7上工作。你有不能处理的特殊案件吗?是的,出于某种原因,它对我不起作用。我使用的是Python 2.7。不知道为什么。我最终放弃了。@MonicaHeddneck-Bummer。没有例子很难知道发生了什么,但我相信它-unicode是一团乱,而且似乎随着时间的推移变得更糟。
In [8]: pd.__version__
Out[8]: '0.14.1'

In [9]: np.__version__
Out[9]: '1.8.1'

In [10]: import sys

In [11]: sys.version
Out[11]: '2.7.3 (default, Jan  7 2013, 09:17:50) \n[GCC 4.4.5]'

In [4]: df = DataFrame(np.arange(9).reshape(9,-1),index=pd.MultiIndex.from_product([list('abc'),date_range('20140721',periods=3)],names=['symbol','date']),columns=['value'])

In [5]: df
Out[5]: 
                   value
symbol date             
a      2014-07-21      0
       2014-07-22      1
       2014-07-23      2
b      2014-07-21      3
       2014-07-22      4
       2014-07-23      5
c      2014-07-21      6
       2014-07-22      7
       2014-07-23      8

In [6]: df.to_hdf('test.h5','df',mode='w',format='table')

In [7]: pd.read_hdf('test.h5','df',where='date=20140722')
Out[7]: 
                   value
symbol date             
a      2014-07-22      1
b      2014-07-22      4
c      2014-07-22      7

In [12]: pd.read_hdf('test.h5','df',where='symbol="a"')
Out[12]: 
                   value
symbol date             
a      2014-07-21      0
       2014-07-22      1
       2014-07-23      2