HDFStore选择多个生成器
问题:我该如何创建一个生成器,以便在pandas HDFStore对象中对多个列进行迭代?
我正在尝试为pandas HDFStore对象创建一个包装类。其中一个我想实现的功能是能够按照指定的块大小(chunksize)对HDFStore中的列组进行迭代。许多机器学习算法可以在线
运行,不需要一次性加载所有数据。
我第一次尝试是创建一个生成器函数,并将开始和结束的参数传递给HDFStore的选择方法:
def iterate(self, key, chunksize=50000):
node = self.store.get_node(key)
nrows = node.table.nrows
current = 0
while current < nrows:
yield self.store.select(key, start=current, stop=current+chunksize)
current += chunksize
这个方法很好用,我能够对存储中的单个列进行迭代。需要注意的是,为了测试,我将每一列都存储在自己的表中。
我的下一步是将这个概念扩展到多个表中的多个列,使用HDFStore.select_as_multiple
。虽然文档中没有说明,但select_as_multiple
似乎也接受开始和结束的参数:
>>> store.select_as_multiple(keys='MachineID', start=0, stop=50000)
<class 'pandas.core.frame.DataFrame'>
Int64Index: 50000 entries, 0 to 49999
Data columns:
MachineID 50000 non-null values
dtypes: int64(1)
如请求的那样,只返回了50,000行。然而,当我传递超过1个键/列时,这个方法却拉回了所有的行:
>>> store.select_as_multiple(keys=['MachineID','YearMade'], start=0, stop=50000)
<class 'pandas.core.frame.DataFrame'>
Int64Index: 401125 entries, 0 to 1124
Data columns:
MachineID 401125 non-null values
YearMade 401125 non-null values
dtypes: int64(2)
是否可以使用select_as_multiple
来拉取指定范围的行,而不是所有的行?
版本信息:
>>> pd.__version__
'0.10.1'
>>> tables.__version__
'2.4.0'
1 个回答
2
这个问题之所以不行,是因为没有把开始和结束的参数传给底层的选择功能。解决起来很简单。
我还打算添加迭代器的支持,准备借用你的函数 :)
完成了,详情请看这里:https://github.com/pydata/pandas/issues/3078
有相关文档,不过简单来说就是:
for df in store.select('df',chunksize=10000):
print df