2017-07-27 1 views
0

J'ai une grande matrice (15000 lignes x 2500 colonnes) stockée à l'aide de PyTables et de voir comment itérer sur les colonnes d'une rangée. Dans le documentation je vois seulement comment accéder à chaque rangée par son nom manuellement.Comment itérer sur les noms de colonnes avec PyTable?

J'ai des colonnes comme:

  • ID
  • X20160730_Day10_123a_2
  • X20160730_Day10_123b_1
  • X20160730_Day10_123b_2

La valeur de la colonne ID est une chaîne comme '10692.RFX7', mais tous les autres les valeurs de cellule sont des flottants. Ce travaux de sélection et je peux parcourir les lignes de résultats, mais je ne peux pas voir comment parcourir les colonnes et vérifier leurs valeurs:

from tables import * 
import numpy 

def main(): 
    h5file = open_file('carlo_seth.h5', mode='r', title='Three-file test') 
    table = h5file.root.expression.readout 

    condition = '(ID == b"10692.RFX7")' 
    for row in table.where(condition): 
     print(row['ID'].decode()) 

     for col in row.fetch_all_fields(): 
      print("{0}\t{1}".format(col, row[col])) 

    h5file.close() 

if __name__ == '__main__': 
    main() 

Si je viens itérer rien « pour col dans la ligne » arrive. Comme le code est au-dessus, je reçois une pile:

10692.RFX7 
Traceback (most recent call last): 
    File "tables/tableextension.pyx", line 1497, in tables.tableextension.Row.__getitem__ (tables/tableextension.c:17226) 
KeyError: b'10692.RFX7' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "tables/tableextension.pyx", line 126, in tables.tableextension.get_nested_field_cache (tables/tableextension.c:2532) 
KeyError: b'10692.RFX7' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "./read_carlo_pytable.py", line 31, in <module> 
    main() 
    File "./read_carlo_pytable.py", line 25, in main 
    print("{0}\t{1}".format(col, row[col])) 
    File "tables/tableextension.pyx", line 1501, in tables.tableextension.Row.__getitem__ (tables/tableextension.c:17286) 
    File "tables/tableextension.pyx", line 133, in tables.tableextension.get_nested_field_cache (tables/tableextension.c:2651) 
    File "tables/utilsextension.pyx", line 927, in tables.utilsextension.get_nested_field (tables/utilsextension.c:8707) 
AttributeError: 'numpy.bytes_' object has no attribute 'encode' 
Closing remaining open files:carlo_seth.h5...done 

Répondre

1

Vous pouvez accéder à une valeur de colonne par son nom dans chaque ligne:

for row in table: 
    print(row["10692.RFX7"]) 

itérer sur toutes les colonnes:

names = table.coldescrs.keys() 
for row in table: 
    for name in names: 
     print(name, row[name]) 
+0

Oui, cette partie était facile. Mais j'ai des milliers de colonnes et je veux parcourir pour vérifier leurs valeurs et imprimer sélectivement les noms des colonnes et leurs valeurs si elles se situent dans une certaine fourchette. L'accès par leur nom manuellement n'aide pas. – Jorvis

+0

Merci! Après votre modification, je vois que vous avez ajouté l'itération. J'étais bloqué en pensant que vous pouviez y accéder à partir de la ligne sélectionnée. Cela marche. – Jorvis