2015-10-31 17 views
6

मेरे पास एक बड़ी एचडीएफ 5 फ़ाइल है, मैं कुछ संचालन करने के लिए एक पांडा डेटाफ्रेम में इसका हिस्सा लोड करना चाहता हूं, लेकिन मुझे कुछ पंक्तियों को फ़िल्टर करने में दिलचस्पी है।शर्तों के साथ pdas डेटाफ्रेम को एचडीएफ 5 फ़ाइल पढ़ें

मैं एक उदाहरण के साथ बेहतर व्याख्या कर सकते हैं:

मूल HDF5 फ़ाइल कुछ ऐसा दिखाई देगा:

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 

मुझे क्या करना कोशिश कर रहा हूँ इस लोड करने के लिए, इसी रूप में काम, एक पांडा के लिए Dataframe लेकिन केवल where A==1 or 3 or 4

अब तक मैं सिर्फ का उपयोग कर पूरे HDF5 लोड कर सकते हैं:

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

मुझे नहीं लगता कि यहां where स्थिति कैसे शामिल करें।

उत्तर

6

hdf5 फ़ाइल table format में लिखा होना चाहिए आदेश pd.read_hdf के where तर्क के साथ queryable होने के लिए (के रूप में fixed प्रारूप के खिलाफ)। (Queryable) डेटा स्तंभ के रूप में सभी स्तंभों को निर्दिष्ट करने के

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

या,:

इसके अलावा, Adeclared as a data_column होना चाहिए

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

तो फिर तुम करने के लिए

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

इस्तेमाल कर सकते हैं पंक्तियों का चयन करें जहां मान कॉलम A 1, 3 या 4 है उदाहरण के लिए,

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]')) 

पैदावार

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 

आप मूल्यों, vals की एक बहुत ही लंबी सूची है, तो आप सही where तर्क रचना के लिए स्वरूपण स्ट्रिंग इस्तेमाल कर सकते हैं:

where='A in {}'.format(vals) 
+0

धन्यवाद unutbu, इस अच्छे उत्तर पर कुछ टिप्पणियां। मैं समझता हूं कि, आपके उत्तर की शुरुआत में आप डीएफ को तालिका प्रारूप में एच 5 लिखते हैं। हालांकि, मेरी स्क्रिप्ट में इनपुट एक एच 5 पहले ही सहेजा गया है, मैं कैसे जान सकता हूं कि यह सही प्रारूप में है या नहीं? – codeKiller

+0

यदि आपकी 'h5' फ़ाइल' table' प्रारूप में नहीं है, तो 'pd.read_hdf' का उपयोग करके 'कहाँ' पैरामीटर बढ़ाएगा 'TypeError: एक निश्चित प्रारूप से पढ़ते समय कहां विनिर्देश पास नहीं कर सकता ...'। यदि 'h5' फ़ाइल 'ए'' द्वारा 'तालिका' प्रारूप में है, तो 'data_column' के रूप में निर्दिष्ट नहीं किया गया था, तो आपको' ValueError: पास किया गया जहां अभिव्यक्ति: ए [1,3,4] में एक अवैध चर शामिल है संदर्भ ... '। – unutbu

+0

मुझे एक एच 5 फ़ाइल को 'निश्चित' से' तालिका' प्रारूप में बदलने या 'data_columns' जोड़ने के लिए त्वरित/आसान तरीका नहीं पता है। जहां तक ​​मुझे पता है, आपको संपूर्ण 'h5' फ़ाइल को डेटाफ्रेम में पढ़ना होगा (या' chunksize' पैरामीटर का उपयोग करके भाग में ऐसा करने के लिए) और फिर इसे लिखने या एक अलग 'h5' फ़ाइल में जोड़ने के लिए 'टेबल' प्रारूप। – unutbu

1

आप (here) का उपयोग कर where के वैकल्पिक पैरामीटर के साथ ऐसा कर सकते हैं।
example के लिए: read_hdf('store_tl.h5', 'table', where = ['index>2'])

+0

धन्यवाद डीन, क्या अधिक जटिल स्थितियों को शामिल करना संभव है? उदाहरण के लिए, यदि मेरे ए कॉलम में 1 से 100 के मान हैं और मैं कुछ यादृच्छिक चुनना चाहता हूं जैसे [1,3,11,16,27,33,34,44,41,55,68,70,77,81 , 9 0] ... मैं यह पूछ रहा हूं क्योंकि मुख्य प्रश्न में मैं इसे आसान बनाना चाहता था, लेकिन मेरे असली मामले में 'कहां' स्थिति को और अधिक जटिल होने की आवश्यकता होगी – codeKiller

+0

उस प्रदाता के लिए प्रलेखन मिला जिसे आपको पास करने की आवश्यकता है जहां: http://nullege.com/codes/search/pandas.computation.pytables.Expr?fulldoc=1 (यह सहायक हो सकता है, हालांकि मुझे रोकथाम द्वारा फ़िल्टर करने के लिए कोई विकल्प नहीं दिख रहा है) –

+0

ठीक है, बहुत बहुत धन्यवाद – codeKiller

संबंधित मुद्दे