2

我有一个作为表格保存到 HDF5 的数据框,但是当 select 语句有浮动时(它确实适用于字符串),我的 where 子句变得混乱。Pandas 0.12 与 Ubuntu 12.04 LTS 上的最新 Numpy。

>>> dim_hdf.select(store_name)
    desc  rowid
0    NaN    NaN
1    1.0      1
2    2.0      2
3    3.0      3
4    4.0      4
5    5.0      5
6    6.0      6
7    7.0      7
8    8.0      8
9    9.0      9
10  10.0     10

>>> dim_hdf.select(store_name).dtypes
desc      object
rowid    float64
dtype: object

>>> dim_hdf.root.dim_29.table
/dim_29/table (Table(11,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "desc": StringCol(itemsize=4, shape=(), dflt='', pos=1),
  "rowid": Float64Col(shape=(), dflt=0.0, pos=2)}
  byteorder := 'little'
  chunkshape := (3276,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "rowid": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "desc": Index(6, medium, shuffle, zlib(1)).is_csi=False}

但是选择出错了(并且确实适用于字符串):

>>> dim_hdf.select(store_name, where=[('rowid','=', 1.0)])
Empty DataFrame
Columns: [desc, rowid]
Index: []

>>> dim_hdf.select(store_name, where=[('rowid','=', '1.0')])
Empty DataFrame
Columns: [desc, rowid]
Index: []

>>> dim_hdf.select(store_name, where=[('desc','=', '1.0')])
  desc  rowid
1  1.0      1

我做错了什么还是这是一个错误?

亲切的问候,

卡斯特

4

1 回答 1

4

我几乎 100% 确定这是 PyTables (>= 2.3) 中的一个非常微妙的错误。见这里:https ://github.com/PyTables/PyTables/issues/282

似乎在具有索引的浮点列上进行选择时,并且np.nan在第一个(第 0 个)元素中有一个,选择不起作用。

np.nan不在第 0 位或没有索引时,选择正常工作。

解决方法是:编写具有值的“虚拟”第一行,或者编写该列没有索引。

In [13]: df = DataFrame(dict(cols = range(6), values = range(6)), dtype='float64')

In [14]: df['cols'] = (df['cols']+10).apply(str)

In [15]: df.iloc[0] = np.nan

In [18]: df
Out[18]: 
   cols  values
0   NaN     NaN
1  11.0       1
2  12.0       2
3  13.0       3
4  14.0       4
5  15.0       5

# write w/o the index on that particular column
In [16]: df.to_hdf('test.h5','df',mode='w',table=True,data_columns=True,index=['cols'])

In [17]: pd.read_hdf('test.h5','df',where=[('values','>',2.0)])
Out[17]: 
   cols  values
3  13.0       3
4  14.0       4
5  15.0       5
于 2013-09-17T00:47:46.767 回答