稀疏稀疏矩阵

时间:2019-01-07 23:26:58

标签: python sparse-matrix pandas-groupby

我有一个包含数百万行的数据框,我想将所有数据保留在稀疏的稀疏矩阵中,以防止出现内存问题。

id     value     count
002    groupB      1
001    groupB      3
001    groupC      1
003    groupC      2
002    groupA      1
004    groupZ      1
 ...

df.groupby(['id', 'value'])['count'].sum()

id  value 
1   groupB    3
    groupC    1
2   groupA    1
    groupB    1
3   groupC    2
4   groupZ    1
Name: count, dtype: int64

我正在尝试将groupby sum的结果用于稀疏矩阵。我在columns_names数组中的预定义标题/列名称。我查了csc_matrix和csr_matrix,但不知道如何将groupby结果转换为稀疏。

我的最终目标是拥有一个这样的数据框,并带有预定义的列名(不一定按字母顺序):

id   groupA    groupB    groupC    groupD   groupE  ..  groupZ   groupAA    ...
001    0         3         1         0        0           0        0
002    1         1         0         0        0           0        0
003    0         0         2         0        0           0        0 
004    0         0         0         0        0           1        0
  ...

1 个答案:

答案 0 :(得分:0)

在熊猫0.23中,有一个SparseSeries数据结构,您可以使用它来获得稀疏矩阵:

s = df.groupby(['id', 'value'])['count'].sum()

ss = s.to_sparse()  # convert to sparse series
coo, rows, columns = ss.to_coo(row_levels=['id'], column_levels=['value'], sort_labels=True)  # convert to coo
result = coo.tocsr()  # convert to csr

print(result)

输出

  (0, 1)    3
  (0, 2)    1
  (1, 0)    1
  (1, 1)    1
  (2, 2)    2
  (3, 3)    1

首先将其转换为稀疏序列,然后转换为coo(请参见to_coo),最后,如果需要,将其转换为csr。可变的行和列包含来自多索引的行和列标签。对于上面的示例,列标签为:

['groupA', 'groupB', 'groupC', 'groupZ']

,行标签为:

[1, 2, 3, 4]