从pandas.HDFStore表中选择列
如何从熊猫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数据;但是,对于将其扩展到更简单的数据框情况,我还是一个新手。我的猜测是我必须以某种方式创建列的索引。谢谢!
-
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解决方案,现在这对您可能是一个好处,因为实际的数据排列应反映您想要查询数据的方式。