【问题标题】:pandas read_hdf with 'where' condition limitation?具有“where”条件限制的 pandas read_hdf?
【发布时间】:2015-04-29 12:39:19
【问题描述】:

我需要查询带有where 子句的HDF5 文件,其中包含3 个条件,其中一个条件是长度为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。任何帮助表示赞赏。

【问题讨论】:

    标签: python pandas hdf5 pytables


    【解决方案1】:

    这是回答here

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2019-01-20
      • 2010-11-07
      • 2020-11-27
      • 1970-01-01
      • 2013-06-25
      • 2023-03-19
      • 2011-02-15
      • 1970-01-01
      相关资源
      最近更新 更多