2014-12-19 66 views
3

我有一個很大但很稀疏的矩陣(50,000行* 100,000列,只有10%的值是已知的)。該矩陣中的每一個已知的元件是浮點數從0.00至1.00,並且這些已知的值被存儲在Python字典中包含的格式:如何有效地從字典創建一個大而稀疏的數據框?

{'c1': {'r1':0.27, 'r3':0.45}, 
'c2': {'r2':0.65, 'r4':0.87} } 

現在的問題是如何從這個字典構建pandas.DataFrame有效率的?這裏,效率包括內存使用量和構建數據幀的時間。

對於內存使用情況,我希望通過np.uint8存儲每個元素。因爲已知的值是從0.00到1.00,我只關心前兩位數字,所以我可以通過乘以100將它轉換爲無符號的8位整數。這可能爲此數據幀節省大量內存。

有沒有辦法做到這一點?

+0

的可能重複[如何構建一個數據幀時,填充缺失的值?] (http://stackoverflow.com/questions/27559409/how-to-fill-the-missing-value-when-constructing-a-dataframe) – aerokite 2014-12-20 18:16:22

+1

你可能會發現我的自我答覆有幫助:http:// stackoverflow。 COM /問題/ 27160867 /有效地構築用稀疏biadjacency矩陣在-numpy的 – nicolaskruchten 2014-12-23 14:09:23

回答

1

dict像:

{'c1': {'r1':0.27, 'r3':0.45}, 
'c2': {'r2':0.65, 'r4':0.87} } 

...最好轉換成歸一化的結構是這樣的:

level0 level1 value 
c1  r1  0.27 
c1  r3  0.45 
c2  r2  0.65 
c2  r4  0.87 

...比樞軸表是這樣的:

 r1 r2 r3 r4 
c1 0.27 nan 0.45 nan 
c2 nan 0.65 nan 0.87 

...因爲後者需要更多的內存。

構建標準化結構的合理存儲,有效的方法是:

input = {'c1': {'r1':0.27, 'r3':0.45}, 
     'c2': {'r2':0.65, 'r4':0.87} } 

result = [] 
for key, value in input.iteritems(): 
    row = pd.Series(value).reset_index() 
    row.insert(0, 'key', key) 
    result.append(row) 

pd.concat(result, ignore_index=True) 

這導致:

key index  0 
0 c2 r2 0.65 
1 c2 r4 0.87 
2 c1 r1 0.27 
3 c1 r3 0.45 
相關問題