2017-12-28 6 views
1

Ich lese in einer großen (~ 10 GB) hdf5 Tabelle mit pandas.read_hdf. Ich benutze Iterator = True, so dass ich auf Blöcke gleichzeitig zugreifen kann (z. B. chunksize = 100000 Zeilen gleichzeitig).Pandas read_hdf: Wie erhält man Spaltennamen, wenn chunksize oder iterator verwendet wird?

Wie bekomme ich eine Liste aller Spaltennamen oder "Schlüssel"?

Wie kommt es auch, dass es keine get_chunk Methode analog zu der für pandas.read_table gibt? Ist das direkte Iterieren über die Chunks der einzige Weg ("für Chunk in Daten:"), und Sie können nicht auf verschiedene nummerierte Chunks nach Belieben zugreifen ("data [300]")?

Edit:

Sieht aus wie ich die Spaltennamen mit einer Schleife zugreifen können, die den ersten Brocken nach dem Zugriff bricht:

for i,v in enumerate(data): 
if i != 0: 
    break 
colnames = v.columns 

Aber dann meine zweite Frage bleibt: Gibt es keine Möglichkeit, den Zugang jeder einzelne Chunk auf dem pandas TextFileReader-Iterator (z. B. imitiert die get_chunk-Methode von read_table, oder mit einem dict-like-Lookup, Daten [0]), anstatt die oben genannte seltsame Einzel-Iteration für die Schleife?

Antwort

1

Haben Sie versucht, die HDF5-Datei als HDFStore zu laden? Das würde Ihnen erlauben, die HDFStore.select Methode zu verwenden, die tun kann, was Sie wollen (mit Suche, etc.). Sie können select verwenden, um nur für eine Untergruppe von Spalten zu arbeiten. Für mich sieht es so aus, als ob es mehr Flexibilität bietet als die read_hdf Funktion. Die folgende könnte helfen, solange Sie die Struktur Ihrer HDF5 Datei kennen:

store = pd.HDFStore('/path/to/file', 'r') 
colnames = store.select('table_key', stop=1).columns 

# iterate over table chunks 
chunksize = 100000 
chunks = store.select('table_key', chunksize=chunksize) 
for chunk in chunks: 
    ...code... 

# select 1 specific chunk as iterator 
chunksize = 100000 
start, stop = 300*chunksize, 301*chunksize 
this_chunk = store.select('table_key', start=start, stop=stop, iterator=True) 
do_work(this_chunk) 

store.close() 

Beachten Sie, dass Sie auch eine HDFStore als Kontext-Manager öffnen kann, zum Beispiel

with pd.HDFStore('/path/to/file', 'r') as store: 
    ...code... 
+0

Ehrfürchtig Dank! – quantumflash

Verwandte Themen