2016-08-01 49 views
2

我已經使用熊貓創建了一個大的(120GB; 10億行)HDF5文件。初始創建HDF文件後,我添加到文件像這樣:pandas.HDFStore:如何修改現有商店的「data_columns」?我想添加索引到不在數據列中的列

with pd.get_store(path_output) as hdf_output: 
    for i in range(BIG_LOOP): 
    df = ... 
    hdf_output.append('all', df, data_columns=[]) 

我有目的地組data_columns = [],以避免在創建時間索引。現在我有HDF文件,我想添加索引到幾列(比如columns_to_index = ['A','B','C'])

不知何故,根據ptdump我確實有data_columns:=['A']在那一刻,但我不記得那是怎麼發生的。 (也許最初的df是用不同的參數編寫的(我連續添加到hdfstore好幾天了,而且我可能已經改變了一些東西),但無論如何,不​​管這是如何創建的,我想索引額外的

只是簡單地調用mystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full')顯然不起作用第一次運行它攪拌了一個小時並向文件大小添加了2 GB(檢查元數據顯示塊大小增加了)但我沒有有3個索引(只是'A'的索引)我怎樣才能生成所有3列的索引?

我也注意到這行在ptdump - 這似乎令人不安,我有「non_index_axes」我想索引的項目是:non_index_axes := [(1, ['A', 'B', 'C'])]

如果無法在熊貓中創建索引,我將不勝感激有關如何直接在pytables中執行此操作的建議。 (例如,我需要先刪除任何現有的索引以及如何修改「non_index_axes」和「data_coumns」?)

編輯:考慮一下我的使用情況下的問題,這裏的大圖片是我試圖完成:

  1. 閱讀來自CSV文件的120 GB數據。每個文件代表一天的財務數據,由100,000行組成,每行大約有十幾列。我只是將每一行按順序存儲在HDF5文件中。我希望這個初始階段能夠快速運行,因此我關閉了索引。目前我在6秒鐘內讀取並解析每個CSV文件,並且如上所述存儲到HDF5文件中僅需1.5秒。

  2. 索引少數(不是全部)列支持各種查詢,例如獲取列1中給定字符串的所有項目以及列2中某個範圍內的日期。

  3. 隨着時間的流逝,每一天我都會解析一個新的CSV文件並將其添加到HDF5文件中。我預計指數將繼續更新。 (根據我的訪問模式,存儲行(當前,按日期)的順序可能仍然是檢索的最佳順序,也可能最終需要在大多數查詢中按不同列進行排序,在這種情況下,我認爲我會需要重新排序表中的每一個CSV文件進行解析,並附加後)。

目前我卡在步驟2中,生成列索引。

回答

1

我會做到這一點有點不同 - take a look at this small example

for chunk in ... # reading data in chunks: 
    # specify `data_columns`, but don't index (`index=False`) 
    hdf_output.append('all', chunk, data_columns=[cols_to_index], index=False) 

# index columns explicitly  
hdf_output.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full') 
+0

謝謝 - 是的,我發現這個指數=假語法後,我已經生成的文件,所以這是偉大的知道。不過,理想情況下,我應該可以修復現有的文件 - 「data_columns」不是在HDF文件中設置的......是嗎? – eraoul

相關問題