Pandas HDF 查询解释器解决方法

Pandas HDF query interpreter workaround

在进行某些查询时,Pandas 中的 HDFStore 模块似乎存在错误,但我找不到解决方法。也就是说,pd.HDFStore.select 似乎在内部将原本有效的字符串重新格式化为错误的语法。例如,由于某种原因,字符串 "03" 将输入 where 语句作为 "0 3",其中 returns 出现 syntax 错误。

示例数据:

p1 = np.random.randint(0,100,(100,2))
p2 = np.random.choice(np.array(range(1990,2010)),100).reshape((100,1))
df = pd.DataFrame(np.concatenate([p2,p1],axis=1), columns = ['year', 'value1', 'value2'])
df.year2 = df.year.astype(str).str[2:]
data_path = "C:/Users/.../some path"
with pd.HDFStore("/".join([data_path, 'sampleData.h5']), 'w') as store:
    store.put('example', df, format='table')

查询工作

query1 = 'year2<={0}'.format('99')
query2 = "year2=={0} | year2=={1}".format('01', '02')

with pd.HDFStore("/".join([data_path, 'sampleData.h5']), 'r') as store:
    df_load = store.select('example', where=[query1],columns = ['year', 'year2', 'value1'])

查询 - 不工作

In [111]: %paste
with pd.HDFStore("/".join([data_path, 'sampleData.h5']), 'r') as store:
    df_load = store.select('example', where=[query2],columns = ['year', 'year2', 'value1'])

## -- End pasted text --
  File "<unknown>", line 1
    (year2 ==0 1 or year2 ==0 2 )
               ^
SyntaxError: invalid syntax

有谁知道不会将 "01" 分成 "0 1" 的锻炼方法?

根据关于 HDF5 Pandas 的文档 queries,不推荐使用上述方法(即 n=5; query="blah blah %d" %n),可能是因为解释器问题。相反,使用 %r 格式化程序传递。

因此,对于上面的例子,你会做

query2 = "year2==%r | year2==%r" %('01', '02')
with pd.HDFStore("/".join([data_path, 'sampleData.h5']), 'r') as store:
    df_load = store.select('example', where=[query2],columns = ['year', 'year2', 'value1'])

有效。