2015-10-31 17 views
6

Çok büyük bir HDF5 dosyam var, bir kısmını bazı işlemleri gerçekleştirmek için bir panda DataFrame'e yüklemek istiyorum ancak bazı satırları filtrelemekle ilgileniyorum.HDF5 dosyasını pandalara oku Şartlar altında DataFrame

Ben bir örnekle daha iyi açıklayabiliriz:

benzer görünümde olacaktır Orjinal HDF5 dosyası: Bir pandalar için

A B C D 
1 0 34 11 
2 0 32 15 
3 1 35 22 
4 1 34 15 
5 1 31 9 
1 0 34 15 
2 1 29 11 
3 0 34 15 
4 1 12 14 
5 0 34 15 
1 0 32 13 
2 1 34 15 
etc etc etc etc 

Ne yapmaya çalışıyorum değişiklik yapmadan olduğu gibi, bu yük olduğunu, Dataframe ama sadece

where A==1 or 3 or 4 Şu ana kadar sadece kullanarak bütün HDF5 yükleyebilirsiniz:

store = pd.HDFStore('Resutls2015_10_21.h5') 
df = pd.DataFrame(store['results_table']) 

Burada bir where koşulunun nasıl ekleneceğini anlamıyorum.

cevap

6

.

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=True, 
      format='table') 

Sonra etmek

pd.read_hdf('/tmp/out.h5', 'results_table', where='A in [1,3,4]') 

kullanabilirsiniz: (queryable) veri sütunları gibi tüm sütunları belirtmek için,

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=['A'], 
      format='table') 

ya:

Dahası, Adeclared as a data_column olmalı A değer sütununun 1, 3 veya 4 olduğu satırları seçin.

where='A in {}'.format(vals) 
: örnek,

import numpy as np 
import pandas as pd 

df = pd.DataFrame({ 
    'A': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2], 
    'B': [0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1], 
    'C': [34, 32, 35, 34, 31, 34, 29, 34, 12, 34, 32, 34], 
    'D': [11, 15, 22, 15, 9, 15, 11, 15, 14, 15, 13, 15]}) 

df.to_hdf('/tmp/out.h5', 'results_table', mode='w', data_columns=['A'], 
      format='table') 

print(pd.read_hdf('/tmp/out.h5', 'results_table', where='A in [1,3,4]')) 

Eğer değerler, vals çok uzun bir liste varsa, o zaman doğru where argüman oluşturmak için biçimlendirme dize kullanabilirsiniz

A B C D 
0 1 0 34 11 
2 3 1 35 22 
3 4 1 34 15 
5 1 0 34 15 
7 3 0 34 15 
8 4 1 12 14 
10 1 0 32 13 

verir

+0

Teşekkürler unutbu, bu iyi cevaba sadece bazı yorumlar. Anladığım kadarıyla, cevabınızın başlangıcında df'yi tablo formatında h5'e yazarsınız. Ancak, betiğimin girdisi zaten kaydedilmiş bir h5'tir, doğru biçimde olup olmadığını nasıl anlayabilirim? – codeKiller

+0

Eğer 'h5' dosyanız 'table' biçiminde değilse,' pd.read_hdf' ile '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' dir'' bir sabit formattan okuduğunda bir belirtimi iletemez. Eğer 'h5' dosyası 'table' biçiminde' A' 'data_column' olarak belirtilmemişse, o zaman 'ValueError' ifadesini alırsınız: İfadenin gerçekleştiği yer: [1,3,4] 'de A geçersiz bir değişken içeriyor referans ... '. – unutbu

+0

Bir h5 dosyasını 'fixed'' 'table' formatına dönüştürmek veya' data_columns' eklemek için hızlı/kolay bir yol bilmiyorum. Bildiğim kadarıyla, tüm h5 dosyasını bir DataFrame'e (veya "chunksize" parametresini kullanarak parçalara ayırmak) okumak ve sonra bunu yazmak veya farklı bir "h5" dosyasına eklemek zorundasınız. tablo biçimi. – unutbu

1

Bunu pandas.read_hdf (here) kullanarak where isteğe bağlı parametresiyle yapabilirsiniz. example için
: read_hdf('store_tl.h5', 'table', where = ['index>2'])pd.read_hdf sitesindeki where bağımsız değişken ile sorgulanabilir olması için (fixed biçimine karşı) hdf5 dosya table format yazılmalıdır

+0

Teşekkürler Dekan, daha karmaşık koşulları dahil etmek mümkün mü? Mesela benim A sütununun 1'den 100'e kadar değerleri varsa ve [1,3,11,16,27,33,34,44,41,55,68,70,77,81] gibi rastgele bir şey seçmek istiyorum. , 90] ... Bunu soruyorum çünkü asıl soruda bunu kolaylaştırmak istedim, ama benim gerçek durumumda 'nerede' durumunun daha karmaşık olması gerekecekti – codeKiller

+0

Expr belgelerini buldum. http://nullege.com/codes/search/pandas.computation.pytables.Expr?fulldoc=1 (Bu, filtrelenerek filtreleme için bir seçenek görmese de yararlı olabilir) –

+0

tamam, çok teşekkürler – codeKiller