HDFStore选择多个生成器

1 投票
1 回答
872 浏览
提问于 2025-04-17 19:25

问题:我该如何创建一个生成器,以便在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

撰写回答