2014-09-07 27 views
6

http://pandas.pydata.org/pandas-docs/stable/io.html#indexingindicizzazione e colonne di dati in Pandas/

sono davvero confuso su questo concetto di colonne di dati nella Panda HDF5 IO. Inoltre c'è pochissima o nessuna informazione su di esso da trovare su google su di esso. Dato che mi sto immergendo in Pandas in un grande progetto che riguarda l'archiviazione HDF5, vorrei essere chiaro su questi concetti.

La documentazione dicono:

è possibile designare (e l'indice) alcune colonne che si desidera essere in grado di eseguire query (diversi dai colonne indicizzabili, che si può sempre query). Ad esempio, si supponga di voler eseguire questa operazione comune su disco e restituire solo il frame che corrisponde a questa query. È possibile specificare data_columns = True per forzare tutte le colonne per essere data_columns

Questo è fonte di confusione:

  1. other than the indexable columns, which you can always query: Quali sono colonne 'intercambiabili'? non sono tutte le colonne 'indicizzabili'? Cosa significa questo termine?

  2. For instance say you want to perform this common operation, on-disk, and return just the frame that matches this query. In che modo è diverso dalle normali query su un Pytable; con o senza indici di data_columns?

  3. Qual è la differenza fondamentale tra una colonna non indicizzata, indicizzata e data_column?

risposta

5

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.

+0

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

+0

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

+0

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

Problemi correlati