问题:如何创建允许在熊猫HDFStore对象中的多个列上进行迭代的生成器?

我正在尝试为熊猫HDFStore对象创建包装器类。我尝试实现的功能之一是能够以给定的块大小对HDFStore中的列组进行迭代。许多机器学习算法都可以运行on-line,并且不需要一次所有数据。

我的第一个尝试是创建一个生成器函数,并将start和stop参数传递给HDFStore的select方法:

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似乎也接受start和stop参数:

>>> 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行。但是,当我传递多个键/列时,该方法将拉回所有行:

>>> 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'

最佳答案

它不起作用,因为没有将开始/停止传递给基础选择。很容易解决。

也意味着增加迭代器支持,这将窃取您的功能:)

做完了
https://github.com/pydata/pandas/issues/3078

有文档,但本质上是:

for df in store.select('df',chunksize=10000):
    print df

10-06 08:51