2014-12-19 48 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