如何从pandas 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 data;但是,我还是个新手,无法将其扩展到更简单的数据帧情况。我的猜测是我必须以某种方式创建列的索引。谢谢!
发布于 2012-12-22 09:27:49
按照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解决方案,这对您现在可能是一个好处,因为实际的数据排列应该反映您希望如何查询数据。
发布于 2012-12-21 01:16:16
您可以使用列的索引来存储数据帧,如下所示:
import pandas as pd
import numpy as np
from pandas.io.pytables import Term
index = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame( np.random.randn(8,3), index=index, columns=list('ABC'))
store = pd.HDFStore('mydata.h5')
store.append('df_cols', df, axes='columns')然后按您希望的方式选择:
In [8]: store.select('df_cols', [Term('columns', '=', 'A')])
Out[8]:
2000-01-01 0.347644
2000-01-02 0.477167
2000-01-03 1.419741
2000-01-04 0.641400
2000-01-05 -1.313405
2000-01-06 -0.137357
2000-01-07 -1.208429
2000-01-08 -0.539854其中:
In [9]: df
Out[9]:
A B C
2000-01-01 0.347644 0.895084 -1.457772
2000-01-02 0.477167 0.464013 -1.974695
2000-01-03 1.419741 0.470735 -0.309796
2000-01-04 0.641400 0.838864 -0.112582
2000-01-05 -1.313405 -0.678250 -0.306318
2000-01-06 -0.137357 -0.723145 0.982987
2000-01-07 -1.208429 -0.672240 1.331291
2000-01-08 -0.539854 -0.184864 -1.056217。
对我来说,这不是一个理想的解决方案,因为我们只能通过一件事来索引DataFrame!令人担忧的是,the docs似乎建议您只能通过一件事来索引DataFrame,至少使用axes
传递带有维度列表的axes关键字(当前必须恰好比对象的总维度小1)。
我可能读错了,在这种情况下,希望有人能证明我错了!
。
注意:我发现一种通过两件事(索引和列)来索引面板的方法是将其转换为DataFrame,然后可以使用两个索引进行检索。但是,每次检索项目时,我们都必须将选定的子面板转换为DataFrame……再说一次,这并不理想。
发布于 2019-07-09 04:36:05
从现在开始,你可以使用查询表达式代替Term构造。例如:store.select('df', "index > Timestamp('20000105')")
https://stackoverflow.com/questions/13926089
复制相似问题