scipy稀疏矩阵分组

时间:2016-02-15 13:37:46

标签: python pandas group-by scipy sparse-matrix

我有一个scipy稀疏矩阵,包含10e6行和10e3列,填充为1%。我还有一个大小为10e6的数组,其中包含与我的稀疏矩阵的10e6行相对应的键。我想按照这些键对稀疏矩阵进行分组,并使用求和函数进行聚合。

示例:

USE [CompDB];
GO
TRUNCATE TABLE [dbo].[Report_table];
GO

更有效的方法是什么?

我已经尝试在稀疏矩阵上使用Keys: ['foo','bar','foo','baz','baz','bar'] Sparse matrix: (0,1) 3 -> corresponds to the first 'foo' key (0,10) 4 -> corresponds to the first 'bar' key (2,1) 1 -> corresponds to the second 'foo' key (1,3) 2 -> corresponds to the first 'baz' key (2,3) 10 -> corresponds to the second 'baz' key (2,4) 1 -> corresponds to the second 'bar' key Expected result: { 'foo': {1: 4}, -> 4 = 3 + 1 'bar': {4: 1, 10: 4}, 'baz': {3: 12} -> 12 = 2 + 10 } 以便能够使用pandas group by但是我得到了这个已知错误:

pandas.SparseSeries.from_coo

1 个答案:

答案 0 :(得分:1)

我可以使用基本字典和列表操作生成目标:

keys = ['foo','bar','foo','baz','baz','bar']
rows = [0,0,2,1,2,2]; cols=[1,10,1,3,3,4]; data=[3,4,1,2,10,1]
dd = {}
for i,k in enumerate(keys):
    d1 = dd.get(k, {})
    v = d1.get(cols[i], 0)
    d1[cols[i]] = v + data[i]
    dd[k] = d1
print dd
制造

{'baz': {3: 12}, 'foo': {1: 4}, 'bar': {10: 4, 4: 1}}

我可以从这些数据中生成稀疏矩阵,并使用:

import numpy as np
from scipy import sparse
M = sparse.coo_matrix((data,(rows,cols)))
print M
print
Md = M.todok()
print Md

但请注意,术语的顺序并不固定。在coo中,订单如输入,但更改格式和订单更改。换句话说,keys与稀疏矩阵的元素之间的匹配是未指定的。

  (0, 1)    3
  (0, 10)   4
  (2, 1)    1
  (1, 3)    2
  (2, 3)    10
  (2, 4)    1

  (0, 1)    3
  (1, 3)    2
  (2, 1)    1
  (2, 3)    10
  (0, 10)   4
  (2, 4)    1

在你清理这个映射之前,最初的字典方法是最好的。