如何有效地从字典创建大而稀疏的数据帧?

时间:2014-12-19 09:49:18

标签: python pandas

我有一个很大但非常稀疏的矩阵(50,000行* 100,000列,只有10%的值是已知的)。此矩阵的每个已知元素都是从0.00到1.00的浮点数,这些已知值存储在python dict中,格式如下:

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

现在的问题是如何有效地从这个dict构造一个pandas.DataFrame?这里,效率包括内存使用和构建数据帧的时间。

对于内存使用,我希望通过np.uint8存储每个元素。因为已知值是0.00到1.00而我只关心前2位数,所以我可以通过乘以100将其转换为无符号8位整数。这可能会为此数据帧节省大量内存。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分: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