2016-08-11 41 views
0

我有一個非常大的數據框保存爲gzip文件。數據在保存之前還需要進行大量的操作。使用gzip數據框,我該如何讀取/解壓縮此行?

可以嘗試將整個gzip數據幀轉換爲文本格式,將其保存到變量中,解析/清除數據,然後通過pandas.read_csv()另存爲.csv文件。但是,這非常耗費內存。

我想讀/解壓縮由管線此文件中的行(因爲這將是最存儲器高效的解決方案,我想),解析這個(例如,具有正則表達式re或者也許是pandas溶液),然後保存在每行成熊貓數據框。

Python有一個gzip庫這樣的:

with gzip.open('filename.gzip', 'rb') as input_file: 
    reader = reader(input_file, delimiter="\t") 
    data = [row for row in reader] 
df = pd.DataFrame(data) 

然而,這似乎所有的信息拖放到「讀者」變量,然後解析。一個人如何以更有效的方式做到這一點?

我應該使用不同的庫而不是gzip

回答

0

也許與gunzip -c提取數據,管到您的Python腳本,並與標準輸入那裏工作:

$ gunzip -c source.gz | python ./line_parser.py | gzip -c - > destination.gz 

在Python腳本line_parser.py

#!/usr/bin/env python 
import sys 
for line in sys.stdin: 
    sys.stdout.write(line) 

替換sys.stdout.write(line)用代碼來處理每行都以您自定義的方式。

+0

我不知道如何在一個自動化的方式做到這一點。輸入gzip,將格式化的數據輸出到.csv(或其他類型)的文件中。 – JianguoHisiang

+0

自動化符合我建議替換的範圍。這就是你放置邏輯的地方。我剛剛給了你一個例子,你寫出這行代碼,但是你可以用你需要的任何邏輯代替它 - 把它轉換爲CSV,不管。 –

+0

我現在明白了 – JianguoHisiang

0

你有沒有使用HDFStore認爲:

HDFStore是一個類似字典的對象,它的讀取和寫入使用使用優秀PyTables庫高性能HDF5格式大熊貓。看到一些先進的策略的食譜

創建存儲,保存數據幀和關閉存儲。

# Note compression. 
store = pd.HDFStore('my_store.h5', mode='w', comp_level=9, complib='blosc') 
with store: 
    store['my_dataframe'] = df 

重新打開存儲,檢索數據幀和關閉商店。

with pd.HDFStore('my_store.h5', mode='r') as store: 
    df = store.get('my_dataframe') 
+1

不回答這個問題嗎?這提供了另一種存儲數據的方式,但不能從gzip文件中讀取文件,從而不能完全填滿內存。 – Kartik

+0

謝謝你的回答,但我仍然有這個'gzip'文件來處理---除非有一個簡單的方法來解析gzip文件並存儲到HDF5中,就像你上面詳細描述的那樣。請告訴我fi這種情況下,我欣賞幫助! – JianguoHisiang

+1

有時回答未經詢問的問題是最好的答覆... – Alexander

1

你不太清楚你想用你巨大的GZIP文件做什麼。 IIUC你無法將整個數據讀入內存,因爲你的GZIP文件很大。所以你唯一的選擇就是以塊處理你的數據。

假設你想從GZIP文件,並處理讀取數據,並將其寫入壓縮文件HDF5:

hdf_key = 'my_hdf_ID' 
cols_to_index = ['colA','colZ'] # list of indexed columns, use `cols_to_index=True` if you want to index ALL columns 
store = pd.HDFStore('/path/to/filename.h5') 
chunksize = 10**5 
for chunk in pd.read_csv('filename.gz', sep='\s*', chunksize=chunksize): 
    # process data in the `chunk` DF 

    # don't index data columns in each iteration - we'll do it later 
    store.append(hdf_key, chunk, data_columns=cols_to_index, index=False, complib='blosc', complevel=4) 

# index data columns in HDFStore 
store.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full') 
store.close()