首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python (熊猫):用多个索引在hdf5中存储数据框架

Python (熊猫):用多个索引在hdf5中存储数据框架
EN

Stack Overflow用户
提问于 2014-07-22 16:31:32
回答 2查看 5.8K关注 0票数 5

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

代码语言:javascript
复制
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,但是当我尝试在一个组中选择数据时,它会创建一个“固定格式存储”:

代码语言:javascript
复制
store.select('table','Symbol == "A"')

它返回一些错误,主要问题是

代码语言:javascript
复制
TypeError: cannot pass a where specification when reading from a Fixed format store. this store must be selected in its entirety

然后,我试图像这样追加DataFrame:

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

这应该会创建一个表,但这给我带来了另一个错误:

代码语言:javascript
复制
TypeError: [unicode] is not implemented as a table column

因此,我需要代码以hdf5格式将数据帧存储在表中,并从单个索引中选择数据(为此目的,我找到了以下代码:store.select('timedata','Symbol == "A"') )

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-22 17:44:28

下面是一个例子

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2015-01-24 19:35:07

杰夫有完全正确的答案。我发现了一些我想要分享的问题,它不适合发表评论--请考虑一下这只是一个很长的附加评论:)

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

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

代码语言:javascript
复制
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的一个评论。杰夫很棒,请原谅我补充的答案,但我想把一些细节写下来,帮我解决一些问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24892904

复制
相关文章

相似问题

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