我有一个很大但非常稀疏的矩阵(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} }
Run Code Online (Sandbox Code Playgroud)
现在的问题是如何有效地从这个dict构造一个pandas.DataFrame?这里,效率包括内存使用和构造数据帧的时间.
对于内存使用,我希望通过np.uint8存储每个元素.因为已知值是0.00到1.00而我只关心前2位数,所以我可以通过乘以100将其转换为无符号8位整数.这可能会为此数据帧节省大量内存.
有没有办法做到这一点?
一样dict:
{'c1': {'r1':0.27, 'r3':0.45},
'c2': {'r2':0.65, 'r4':0.87} }
Run Code Online (Sandbox Code Playgroud)
...最好转换成这样的标准化结构:
level0 level1 value
c1 r1 0.27
c1 r3 0.45
c2 r2 0.65
c2 r4 0.87
Run Code Online (Sandbox Code Playgroud)
...比这样的数据透视表:
r1 r2 r3 r4
c1 0.27 nan 0.45 nan
c2 nan 0.65 nan 0.87
Run Code Online (Sandbox Code Playgroud)
...因为后者需要更多的内存。
构造规范化结构的一种相当节省内存的方法是:
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)
Run Code Online (Sandbox Code Playgroud)
这导致:
key index 0
0 c2 r2 0.65
1 c2 r4 0.87
2 c1 r1 0.27
3 c1 r3 0.45
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
610 次 |
| 最近记录: |