【问题标题】:Scripy sparse matrixScipy 稀疏矩阵
【发布时间】:2019-01-08 07:40:52
【问题描述】:

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

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
  ...

【问题讨论】:

    标签: python sparse-matrix pandas-groupby


    【解决方案1】:

    在pandas 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]
    

    【讨论】:

    • 是否可以传入我定义的标签?我不想对标签进行排序,因为它们不是按字母顺序排列的
    • 您可以将 sort_labels 设置为 false sort_labels=False,看看是否可行。
    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2017-03-31
    • 2023-04-10
    • 2017-07-21
    • 2011-11-28
    • 2017-07-02
    • 2011-03-07
    • 2014-10-15
    相关资源
    最近更新 更多