我需要使用3个条件的HDF5
子句查询where
文件,条件之一是长度为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')
或条件数只能为两个(列表长度为30):
然后执行正常:
myList = list(xrange(30))
h5DF = pd.read_hdf(h5Filename, 'df', where='index=myList & time=timeString')
这是已知限制吗? http://pandas.pydata.org/pandas-docs/dev/generated/pandas.io.pytables.read_hdf.html的pandas文档没有提及此限制,在搜索此论坛后,似乎还没有人遇到此限制。
版本是pandas 0.15.2
。任何帮助表示赞赏。
python大神给出的解决方案
回答here
这是一个缺陷,因为numpy/numexpr
不能处理树中超过31个操作数。 foo=[1,2,3,4]
的位置中的HDFStore
这样的表达式会生成(foo==1) | (foo==2) ....
这样的表达式,因此它们会被扩展,如果太多,则会失败。
HDFStore
使用单个操作数来处理此问题(如果只使用foo=[range(31)]
可以使用IOW,但是由于您碰巧有一个嵌套的子表达式,其中子节点本身太长,因此会出错。
通常,执行此操作的更好方法是选择更大的范围(例如,每个操作数选择的终点),然后在内存中执行.isin
。它甚至可能更快,因为在选择较大范围(即使将更多数据存储到内存)而不是单个选择时,HDF5往往更有效。