pandas read_hdf 和 'where' 条件限制?

pandas read_hdf with 'where' condition limitation?

我需要用 where 子句和 3 个条件查询一个 HDF5 文件,其中一个条件是一个长度为 30 的列表:

myList = list(xrange(30))

h5DF   = pd.read_hdf(h5Filename, 'df', where='index=myList & date=dateString & time=timeString')

上面的查询给了我 ValueError: too many inputs 并且错误是可重现的。

如果我将列表的长度减少到 29(三个条件):

myList = list(xrange(29))

h5DF   = pd.read_hdf(h5Filename, 'df', where='index=myList & date=dateString & time=timeString')

OR 条件数只给两个(列表长度为30):

然后执行正常:

myList = list(xrange(30))

h5DF   = pd.read_hdf(h5Filename, 'df', where='index=myList & time=timeString')

这是已知的限制吗? pandas http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.pytables.read_hdf.html 的文档没有提及此限制,似乎在搜索此论坛后还没有人遇到此限制。

版本为 pandas 0.15.2。感谢任何帮助。

已回答here

这是一个缺陷,因为 numpy/numexpr 不能处理树中超过 31 个操作数。 HDFStore 所在位置的 foo=[1,2,3,4] 等表达式会生成 (foo==1) | (foo==2) .... 等表达式,因此它们会被扩展,如果有太多可能会失败。

HDFStore 用单个操作数处理这个问题(IOW 如果你只有 foo=[range(31)] 没问题,但是因为你碰巧有一个嵌套的子表达式,其中子节点本身太长它出错了。

通常,更好的方法是 select 更大的范围(例如,可能是每个操作数的 selection 的端点),然后在内存中执行 .isin。它甚至可能更快,因为当 selecting 更大的范围(即使你将更多数据带入内存)而不是单个 select 离子时,HDF5 往往更有效恕我直言。