你应该尝试一下。
In [22]: df = DataFrame(np.random.randn(5,2),columns=['A','B'])
In [23]: store = pd.HDFStore('test.h5',mode='w')
In [24]: store.append('df_only_indexables',df)
In [25]: store.append('df_with_data_columns',df,data_columns=True)
In [26]: store.append('df_no_index',df,data_columns=True,index=False)
In [27]: store
Out[27]:
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df_no_index frame_table (typ->appendable,nrows->5,ncols->2,indexers->[index],dc->[A,B])
/df_only_indexables frame_table (typ->appendable,nrows->5,ncols->2,indexers->[index])
/df_with_data_columns frame_table (typ->appendable,nrows->5,ncols->2,indexers->[index],dc->[A,B])
In [28]: store.close()
如果不指定data_columns
参数,则存储的帧的索引被自动设置为可查询列。默认情况下,无法查询其他列。
如果指定了data_columns=True
或data_columns=list_of_columns
,则这些列将被单独存储,并且随后可以查询。
如果指定了index=False
,则对于可查询列(例如index
和/或data_columns
),将不会自动创建PyTables
索引。
要查看实际创建的索引(即PyTables
索引),请参见下面的输出。 colindexes
定义哪些列具有实际的PyTables
索引(已经进行了某种程度上的截断)。
/df_no_index/table (Table(5,)) ''
description :=
byteorder := 'little'
chunkshape := (2730,)
/df_no_index/table._v_attrs (AttributeSet), 15 attributes:
[A_dtype := 'float64',
A_kind := ['A'],
B_dtype := 'float64',
B_kind := ['B'],
CLASS := 'TABLE',
FIELD_0_FILL := 0,
FIELD_0_NAME := 'index',
FIELD_1_FILL := 0.0,
FIELD_1_NAME := 'A',
FIELD_2_FILL := 0.0,
FIELD_2_NAME := 'B',
NROWS := 5,
TITLE := '',
VERSION := '2.7',
index_kind := 'integer']
/df_only_indexables/table (Table(5,)) ''
description :=
byteorder := 'little'
chunkshape := (2730,)
autoindex := True
colindexes :=
/df_only_indexables/table._v_attrs (AttributeSet), 11 attributes:
[CLASS := 'TABLE',
FIELD_0_FILL := 0,
FIELD_0_NAME := 'index',
FIELD_1_FILL := 0.0,
FIELD_1_NAME := 'values_block_0',
NROWS := 5,
TITLE := '',
VERSION := '2.7',
index_kind := 'integer',
values_block_0_dtype := 'float64',
values_block_0_kind := ['A', 'B']]
/df_with_data_columns/table (Table(5,)) ''
description :=
byteorder := 'little'
chunkshape := (2730,)
autoindex := True
colindexes :=
/df_with_data_columns/table._v_attrs (AttributeSet), 15 attributes:
[A_dtype := 'float64',
A_kind := ['A'],
B_dtype := 'float64',
B_kind := ['B'],
CLASS := 'TABLE',
FIELD_0_FILL := 0,
FIELD_0_NAME := 'index',
FIELD_1_FILL := 0.0,
FIELD_1_NAME := 'A',
FIELD_2_FILL := 0.0,
FIELD_2_NAME := 'B',
NROWS := 5,
TITLE := '',
VERSION := '2.7',
index_kind := 'integer']
如果您想查询一列数据,请将其设置为data_column
。如果没有这样做,则它们会按dtype存储在块中(速度更快/占用空间较少)。
通常,您总是希望对要检索的列进行索引,但是,如果您正在创建并将多个文件附加到单个存储中,则通常关闭索引创建,并在最后执行它(因为逐步创建索引非常昂贵)。
有关各种问题,请参见食谱。
HDFStore.select_column
函数时出现了问题。在弄清楚需要在data_columns
中设置列之后才发现了这个问题。这个github问题进一步深入了解:https://github.com/pandas-dev/pandas/issues/21188 - Nikhil VJ