如何从熊猫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
对象。所提供的示例应用于面板数据;但是,我是一个新手,无法将其扩展到更简单的数据框架案例。我想我必须以某种方式创建列的索引。谢谢! 最佳答案
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提供了面板解决方案,这可能对您现在有好处,因为实际的数据分配应该反映您希望如何查询数据。
关于python - 从pandas.HDFStore表中选择列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13926089/