我需要使用 where
子句查询具有 3 个条件的 HDF5
文件,其中一个条件是长度为 30 的列表:
myList = list(xrange(30))
h5DF = pd.read_hdf(h5Filename, 'df', where='index=myList & date=dateString & time=timeString')
上面的查询给了我ValueError:太多输入
并且错误是可重现的。
如果我将列表的长度减少到 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
的 where 中类似 foo=[1,2,3,4]
的表达式会生成类似 (foo==1) | 的表达式。 (foo==2) ....
所以这些会被扩展,如果你有太多可能会失败。
HDFStore
使用单个操作数处理此问题(IOW,如果您只有 foo=[range(31)]
就可以了,但是因为您碰巧有一个嵌套的子操作- 子节点本身太长的表达式会出错。
通常,更好的方法是选择更大的范围(例如,可能是每个操作数的选择端点),然后执行内存中的 .isin
。它甚至可能会更快,因为恕我直言,在选择较大范围时(即使您将更多数据存入内存),而不是单独选择时,HDF5 往往更高效。
关于python - pandas read_hdf 具有 'where' 条件限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28754265/