pandas read_hdf with'其中'条件限制?

时间:2015-02-26 22:46:14

标签: python pandas hdf5 pytables

我需要使用HDF5子句查询带有3个条件的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')

OR 条件数量只有两个(列表长度为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。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:4)

已回答here

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

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

通常,更好的方法是选择更大的范围(例如,可能是每个操作数的选择的终点),然后执行内存中的.isin。它甚至可能更快,因为HDF5在选择更大的范围时(即使你将更多的数据带入内存)往往更有效率,而不是个人选择。