【问题标题】:Pandas read_hdf() returns "invalid variable reference" on valid where conditionPandas read_hdf() 在有效 where 条件下返回“无效变量引用”
【发布时间】:2019-01-20 12:31:59
【问题描述】:

我正在尝试使用方法 read_hdb 的属性 where 将数据从大型 HDF 存储过滤到所需的子集:

phase = pd.read_hdf(DSPATH + '/phase-table.h5', 'phase', where='EXTSIDNAME=="A"')

根据文档,我可以使用基本逻辑条件指定数据集中定义的任何列。根据 Pandas documentation 语法 column_name == 'string literal' 是支持的。

但是,对于我尝试指定的任何列,该库都会引发 ValueError 异常:

ValueError: The passed where expression: EXTSIDNAME=="A"
            contains an invalid variable reference
            all of the variable references must be a reference to
            an axis (e.g. 'index' or 'columns'), or a data_column
            The currently defined references are: index,columns

唯一没有通过错误的条件是'index=1'

该列存在于数据存储中。如果我在没有过滤器的情况下加载它,我可以看到我正在尝试指定 where 条件确实存在:

Index(['EXTSIDNAME', 'HOSTNAME', 'TIMESTP', 'SUM_ENDDATE','MODULE_ID','MODULENAME',
'MODULE_STARTDATE', 'MODULE_ENDDATE', 'PHASE_ID','PHASENAME', 
'PHASE_STARTDATE', 'PHASE_ENDDATE', 'ID', 'PhaseDuration'], dtype='object')

我正在使用 Anaconda 包中最新的稳定库。

【问题讨论】:

    标签: python pandas hdfstore


    【解决方案1】:

    如果您使用to_hdf() 创建了HDF 存储,则需要指定data_columns 参数。类似的问题发布在here

    一个例子:

    d = {'Col': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'D'],
         'X': [1, 2, 3, 4, 5, 6, 7, 8]}
    df = pd.DataFrame.from_dict(d)
    

    df 看起来像这样:

      Col  X
    0   A  1
    1   A  2
    2   A  3
    3   B  4
    4   B  5
    5   B  6
    6   C  7
    7   D  8
    

    让我们用to_hdf() 将它写入.h5 文件。格式等于'table',这一点很重要:

    df.to_hdf('myhdf.h5', 'somekey', format='table')
    

    现在让我们用read_hdf()阅读它:

    pd.read_hdf('myhdf.h5', key='somekey', where='Col==A')
    

    返回错误:

    ValueError: The passed where expression: Col==A
                contains an invalid variable reference
                all of the variable refrences must be a reference to
                an axis (e.g. 'index' or 'columns'), or a data_column
                The currently defined references are: index,columns
    

    什么给了?

    当你做to_hdf()时,你还需要像这样定义data_columns

    df.to_hdf('myhdf.h5', 'somekey', format='table', data_columns=['Col', 'X'])
    

    现在您可以使用 where 从 .h5 文件中读取数据:

    pd.read_hdf('myhdf.h5', key='somekey', where='Col==A')
      Col  X
    0   A  1
    1   A  2
    2   A  3
    

    where 为列表:

    pd.read_hdf('myhdf.h5', key='somekey', where=['Col==A', 'X==2'])
      Col  X
    1   A  2
    

    【讨论】:

    • 正是这样!此外,正如我现在所见,Pandas documentation 中指出,如果查询表达式具有未知变量引用,select 将引发 ValueError。通常这意味着您正在尝试在不是 data_column 的列上进行选择。 此外,可以指定 data_columns=True 而不是 data_columns=True 来索引所有列,从而使它们可用于在 where 中进行过滤子句。
    • 酷!我不知道data_columns=True 部分。我希望我能记住这一点。
    猜你喜欢
    • 2015-04-29
    • 2016-10-27
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2022-01-06
    • 2021-08-13
    相关资源
    最近更新 更多