具有“ where”条件限制的熊猫read_hdf?

Om *_*Nom 2 python hdf5 pytables pandas

我需要查询带有3个条件的子句的HDF5文件,where条件之一是长度为30的列表:

myList = list(xrange(30))

h5DF   = pd.read_hdf(h5Filename, 'df', where='index=myList & date=dateString & time=timeString')
Run Code Online (Sandbox Code Playgroud)

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

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

myList = list(xrange(29))

h5DF   = pd.read_hdf(h5Filename, 'df', where='index=myList & date=dateString & time=timeString')
Run Code Online (Sandbox Code Playgroud)

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

然后执行正常:

myList = list(xrange(30))

h5DF   = pd.read_hdf(h5Filename, 'df', where='index=myList & time=timeString')
Run Code Online (Sandbox Code Playgroud)

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

版本是pandas 0.15.2。任何帮助表示赞赏。

Jef*_*eff 5

在这里回答

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

HDFStore用一个操作数来处理这个问题(如果有的话,可以使用IOW foo=[range(31)],但是因为您碰巧有一个嵌套的子表达式,其中子节点本身太长,所以会出错。

通常,执行此操作的更好方法是选择更大的范围(例如,可能是每个操作数选择的终点),然后执行内存操作.isin。它甚至可能更快,因为在选择较大范围时(即使您将更多数据存储到内存中),HDF5往往更有效,恕我直言,而不是单独选择。