熊猫read_hdf()在有效的where条件下返回“无效的变量引用”

时间:2018-08-13 17:58:19

标签: python pandas hdfstore

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

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

根据文档,我可以使用基本逻辑条件指定数据集中定义的任何列。根据熊猫documentation的语法,支持 column_name =='字符串文字'

该库对我尝试指定的任何列均引发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捆绑包中的最新稳定库。

1 个答案:

答案 0 :(得分:0)

如果使用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