从pandas.HDFStore表中选择列

发布于 2021-01-29 17:06:12

如何从熊猫HDFStore检索特定列?我经常处理非常大的数据集,这些数据集太大而无法在内存中进行操作。我想迭代地读取一个csv文件,将每个块附加到HDFStore对象中,然后使用数据的子集。我已经阅读了一个简单的csv文件,并使用以下代码将其加载到HDFStore中:

tmp = pd.HDFStore('test.h5')
chunker = pd.read_csv('cars.csv', iterator=True, chunksize=10, names=['make','model','drop'])
tmp.append('df', pd.concat([chunk for chunk in chunker], ignore_index=True))

并输出:

In [97]: tmp
Out[97]:
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df     frame_table (typ->appendable,nrows->1930,indexers->[index])

我的问题是如何从中访问特定的列tmp['df']?文档中提到了一种select()方法和一些Term对象。提供的示例适用于Panel数据;但是,对于将其扩展到更简单的数据框情况,我还是一个新手。我的猜测是我必须以某种方式创建列的索引。谢谢!

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    HDFStore记录表的方式是按类型将列存储为单个numpy数组。您总是会取回所有列,可以对其进行过滤,因此将根据您的要求返回您。在0.10.0中,您可以传递涉及列的术语。

    store.select('df', [ Term('index', '>', Timestamp('20010105')), 
                         Term('columns', '=', ['A','B']) ])
    

    或者您可以在以后重新编制索引

    df = store.select('df', [ Term('index', '>', Timestamp('20010105') ])
    df.reindex(columns = ['A','B'])
    

    axes实际上不是解决方案(实际上创建的实际上是存储转置帧)。该参数允许您对轴的存储进行重新排序,以启用数据对齐方式。对于一个数据框来说,它的意义并不大。对于3d或4d结构,磁盘数据对齐对于真正快速的查询至关重要。

    0.10.1将提供一个更优雅的解决方案,即数据列,也就是说,您可以选择某些列来表示为表存储中的自己的列,因此您实际上可以只选择它们。这里有一种味道。

     store.append('df', columns = ['A','B','C'])
     store.select('df', [ 'A > 0', Term('index', '>', Timestamp(2000105)) ])
    

    进行此操作的另一种方法是将单独的表存储在文件的不同节点中,然后只能选择所需的内容。

    总的来说,我建议再次使用宽表。hayden提供了Panel解决方案,现在这对您可能是一个好处,因为实际的数据排列应反映您想要查询数据的方式。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看