Si consiglia di provarlo.
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()
si ottiene automaticamente l'indice del quadro memorizzato come una colonna interrogabile. Di default NON è possibile interrogare altre colonne.
Se si specifica data_columns=True
o data_columns=list_of_columns
, questi vengono memorizzati separatamente e possono essere successivamente interrogati.
Se si specifica index=False
quindi un indice PyTables
non viene creata automaticamente per la colonna interrogabile (ad es. La index
e/o data_columns
).
Per visualizzare gli indici reali creati (i PyTables
indici), vedi l'uscita in basso. colindexes
definisce quali colonne hanno un indice effettivo PyTables
creato. (L'ho troncato un po ').
/df_no_index/table (Table(5,)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"A": Float64Col(shape=(), dflt=0.0, pos=1),
"B": Float64Col(shape=(), dflt=0.0, pos=2)}
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 := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(2,), dflt=0.0, pos=1)}
byteorder := 'little'
chunkshape := (2730,)
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False}
/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 := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"A": Float64Col(shape=(), dflt=0.0, pos=1),
"B": Float64Col(shape=(), dflt=0.0, pos=2)}
byteorder := 'little'
chunkshape := (2730,)
autoindex := True
colindexes := {
"A": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"B": Index(6, medium, shuffle, zlib(1)).is_csi=False}
/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']
Quindi, se si desidera eseguire una query una colonna, ne fanno un data_column
. Se non lo fai, verranno archiviati in blocchi per dtype (più veloce/meno spazio).
Normalmente si desidera sempre indicizzare una colonna per il recupero, MA, se si creano e quindi si aggiungono più file a un singolo archivio, di solito si disattiva la creazione dell'indice e si esegue alla fine (poiché è piuttosto costoso creare mentre andate).
Vedere the cookbook per un serraglio di domande.
Qual è l'uso dell'indice di impostazione = Vero? Mi sembra di poter impostare data_columns = True, index = False, e posso ancora interrogare la tabella usando le sue colonne – Michael
certo che puoi ma non otterrai effettivamente il vantaggio di avere un indice che causa una scansione lineare per qualsiasi query . index = False è utile quando si aggiunge, per esempio moltiplicare l'accodamento e quindi costruire l'indice è più efficiente di aggiungere un indice (per grandi quantità di dati) – Jeff
come faccio a costruire un indice dopo aver finito di aggiungere? Non sono riuscito a trovare un esempio sulla documentazione dei panda? Grazie per l'aiuto. – Michael