我有一个很大但非常稀疏的矩阵(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位整数。这可能会为此数据帧节省大量内存。
有没有办法做到这一点?
答案 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