我需要使用多索引的大维数据框架,所以我尝试创建一个数据框架来学习如何将它存储在hdf5文件中。数据框架如下所示:(前2列中有多个索引)
Symbol Date 0
C 2014-07-21 4792
B 2014-07-21 4492
A 2014-07-21 5681
B 2014-07-21 8310
A 2014-07-21 1197
C 2014-07-21 4722
2014-07-21 7695
2014-07-21 1774我使用的是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然后,我试图像这样追加DataFrame:
store.append('ts1',timedata)这应该会创建一个表,但这给我带来了另一个错误:
TypeError: [unicode] is not implemented as a table column因此,我需要代码以hdf5格式将数据帧存储在表中,并从单个索引中选择数据(为此目的,我找到了以下代码:store.select('timedata','Symbol == "A"') )
发布于 2014-07-22 17:44:28
下面是一个例子
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发布于 2015-01-24 19:35:07
杰夫有完全正确的答案。我发现了一些我想要分享的问题,它不适合发表评论--请考虑一下这只是一个很长的附加评论:)
(Pytables版本)如果在尝试编写hdf文件时缺少属性或方法错误,则可能需要尝试更新PyTables版本。熊猫(在撰写本文时)利用了Pytable,我发现至少有一对版本会抛出一些奇怪的错误,直到我更新Pytable并重新加载。
(数据类型)这在Python3中可能是固定的,但在2.7x中,to_hdf在unicode、混合数据类型列和浮点数的NaN值方面存在问题。下面是一个示例实用程序函数,用于清除DataFrame,为编写解决所有这些问题的to_hdf做准备。请注意,它将NaN替换为零,这对于我的应用程序是合适的,但您可能需要调整它:
def clean_cols_for_hdf(data):
types = data.apply(lambda x: pd.lib.infer_dtype(x.values))
for col in types[types=='mixed'].index:
data[col] = .data[col].astype(str)
data[<your appropriate columns here>].fillna(0,inplace=True)
return data
其中一些只是扩展了Jeff的一个评论。杰夫很棒,请原谅我补充的答案,但我想把一些细节写下来,帮我解决一些问题。
https://stackoverflow.com/questions/24892904
复制相似问题