1、簡介數組
HDF5(Hierarchical Data Formal)是用於存儲大規模數值數據的較爲理想的存儲格式,文件後綴名爲h5,存儲讀取速度很是快,且可在文件內部按照明確的層次存儲數據,同一個HDF5能夠看作一個高度整合的文件夾,其內部可存放不一樣類型的數據。在Python中操縱HDF5文件的方式主要有兩種,一是利用pandas中內建的一系列HDF5文件操做相關的方法來將pandas中的數據結構保存在HDF5文件中,二是利用h5py模塊來完成從Python原生數據結構向HDF5格式的保存,本文就將針對pandas中讀寫HDF5文件的方法進行介紹。數據結構
2、利用pandas操縱HDF5文件dom
2.1 寫出測試
pandas中的HDFStore()用於生成管理HDF5文件IO操做的對象,其主要參數以下:spa
path:字符型輸入,用於指定h5文件的名稱(不在當前工做目錄時須要帶上完整路徑信息)3d
mode:用於指定IO操做的模式,與Python內建的open()中的參數一致,默認爲'a',即當指定文件已存在時不影響原有數據寫入,指定文件不存在時則新建文件;'r',只讀模式;'w',建立新文件(會覆蓋同名舊文件);'r+',與'a'做用類似,但要求文件必須已經存在;code
complevel:int型,用於控制h5文件的壓縮水平,取值範圍在0-9之間,越大則文件的壓縮程度越大,佔用的空間越小,但相對應的在讀取文件時須要付出更多解壓縮的時間成本,默認爲0,表明不壓縮orm
下面咱們建立一個HDF5 IO對象store:對象
import pandas as pd store = pd.HDFStore('demo.h5') '''查看store類型''' print(store)
能夠看到store對象屬於pandas的io類,經過上面的語句咱們已經成功的初始化名爲demo.h5的的文件,本地也相應的出現了以下的文件:blog
接下來咱們建立pandas中不一樣的兩種對象,並將它們共同保存到store中,首先建立series對象:
import numpy as np #建立一個series對象 s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e']) s
接着咱們建立一個dataframe對象:
#建立一個dataframe對象 df = pd.DataFrame(np.random.randn(8, 3), columns=['A', 'B', 'C']) df
第一種方式利用鍵值對將不一樣的數據存入store對象中,這裏爲了代碼簡潔使用了元組賦值法:
store['s'],store['df'] = s,df
第二種方式利用store對象的put()方法,其主要參數以下:
key:指定h5文件中待寫入數據的key
value:指定與key對應的待寫入的數據
format:字符型輸入,用於指定寫出的模式,'fixed'對應的模式速度快,可是不支持追加也不支持檢索;'table'對應的模式以表格的模式寫出,速度稍慢,可是支持直接經過store對象進行追加和表格查詢操做
使用put()方法將數據存入store對象中:
store.put(key='s',value=s);store.put(key='df',value=df)
既然是鍵值對的格式,那麼能夠查看store的items屬性(注意這裏store對象只有items和keys屬性,沒有values屬性):
store.items
調用store對象中的數據直接用對應的鍵名來索引便可:
store['df']
刪除store對象中指定數據的方法有兩種,一是使用remove()方法,傳入要刪除數據對應的鍵:
store.remove('s') print(store.keys())
二是使用Python中的關鍵詞del來刪除指定數據:
del store['s'] print(store.keys())
打印出的結果都以下:
這時若想將當前的store對象持久化到本地,只須要利用close()方法關閉store對象便可:
store.close() '''查看store鏈接情況,False則表明已關閉''' store.is_open
這時本地的h5文件也相應的存儲進store對象關閉前包含的文件:
除了經過定義一個確切的store對象的方式,還能夠從pandas中的數據結構直接導出到本地h5文件中:
#建立新的數據框 df_ = pd.DataFrame(np.random.randn(5,5)) #導出到已存在的h5文件中,這裏須要指定key df_.to_hdf(path_or_buf='demo.h5',key='df_') #建立於本地demo.h5進行IO鏈接的store對象 store = pd.HDFStore('demo.h5') #查看指定h5對象中的全部鍵 print(store.keys())
2.2 讀入
在pandas中讀入HDF5文件的方式主要有兩種,一是經過上一節中相似的方式建立與本地h5文件鏈接的IO對象,接着使用鍵索引或者store對象的get()方法傳入要提取數據的key來讀入指定數據:
store = pd.HDFStore('demo.h5') '''方式1''' df1 = store['df'] '''方式2''' df2 = store.get('df') df1 == df2
能夠看出這兩種方式都能順利讀取鍵對應的數據。
第二種讀入h5格式文件中數據的方法是pandas中的read_hdf(),其主要參數以下:
path_or_buf:傳入指定h5文件的名稱
key:要提取數據的鍵
須要注意的是利用read_hdf()讀取h5文件時對應文件不能夠同時存在其餘未關閉的IO對象,不然會報錯,以下例:
print(store.is_open) df = pd.read_hdf('demo.h5',key='df')
把IO對象關閉後再次提取:
store.close() print(store.is_open) df = pd.read_hdf('demo.h5',key='df') df
2.3 速度比較
這一小節咱們來測試一下對於存儲一樣數據的csv格式文件、h5格式的文件,在讀取速度上的差別狀況:
這裏咱們首先建立一個很是大的數據框,由一億行x5列浮點類型的標準正態分佈隨機數組成,接着分別用pandas中寫出HDF5和csv格式文件的方式持久化存儲:
import pandas as pd import numpy as np import time store = pd.HDFStore('store.h5') #生成一個1億行,5列的標準正態分佈隨機數表 df = pd.DataFrame(np.random.rand(100000000,5)) start1 = time.clock() store['df'] = df store.close() print(f'HDF5存儲用時{time.clock()-start1}秒') start2 = time.clock() df.to_csv('df.csv',index=False) print(f'csv存儲用時{time.clock()-start2}秒')
在寫出一樣大小的數據框上,HDF5比常規的csv快了將近50倍,並且二者存儲後的文件大小也存在很大差別:
csv比HDF5多佔用將近一倍的空間,這仍是在咱們沒有開啓HDF5壓縮的狀況下,接下來咱們關閉全部IO鏈接,運行下面的代碼來比較對上述兩個文件中數據還原到數據框上二者用時差別:
import pandas as pd import time start1 = time.clock() store = pd.HDFStore('store.h5',mode='r') df1 = store.get('df') print(f'HDF5讀取用時{time.clock()-start1}秒') start2 = time.clock() df2 = pd.read_csv('df.csv') print(f'csv讀取用時{time.clock()-start2}秒')
HDF5用時僅爲csv的1/13,所以在涉及到數據存儲特別是規模較大的數據時,HDF5是你不錯的選擇。
以上就是本文的所有內容,若有筆誤望指出!