【问题标题】:How to create a large but sparse dataframe from a dict efficiently?如何有效地从字典创建一个大而稀疏的数据框?
【发布时间】:2015-02-18 05:34:06
【问题描述】:

我有一个很大但非常稀疏的矩阵(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} }

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

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

有什么办法吗?

【问题讨论】:

标签: python pandas


【解决方案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

【讨论】:

  • 作者的答案,但不是其他人的通用解决方案。我确实需要一种将稀疏数据转换为数据透视表的方法。
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2014-11-30
  • 1970-01-01
  • 2016-09-02
  • 2015-10-18
相关资源
最近更新 更多