将稀疏矩阵转换为熊猫数据框

Posted

技术标签:

【中文标题】将稀疏矩阵转换为熊猫数据框【英文标题】:Convert sparse matrix to pandas dataframe 【发布时间】:2021-12-14 00:35:47 【问题描述】:
import numpy as np
from scipy.sparse import csr_matrix

csr = csr_matrix(np.array(
    [[0, 0, 4],
     [1, 0, 0],
     [2, 0, 0],]))

# Return a Coordinate (coo) representation of the csr matrix.
coo = csr.tocoo(copy=False)

# Access `row`, `col` and `data` properties of coo matrix.
df = pd.DataFrame('index': coo.row, 'col': coo.col, 'data': coo.data)[['index', 'col', 'data']]

>>> df.head()
   index  col  data
0    0     2     4
1    1     0     1
2    2     0     2

我尝试将 scipy csr_matrix 矩阵转换为数据框,其中的列代表矩阵的索引、列和数据。

唯一的问题是我上面尝试的方法不会为值为 0 的列生成行。这是我希望输出的样子:

>>> df.head()
   index  col  data
0    0     0     0
1    0     1     0
2    0     2     4
3    1     0     1
4    1     1     0
5    1     2     0
6    2     0     2
7    2     1     0
8    2     2     0

你会看到上面的代码 sn-p 取自this answer in this thread。

我的请求/问题:有没有办法将矩阵转换为 df 并包含值为 0 的矩阵元素?

【问题讨论】:

【参考方案1】:

一种方法是创建一个filling DataFrame 并将其(使用combine_first)与您已有的数据框结合起来:

df = pd.DataFrame('index': coo.row, 'col': coo.col, 'data': coo.data).set_index(["index", "col"])

n_rows, n_cols = coo.shape
rows, cols = map(np.ndarray.flatten, np.mgrid[:n_rows, :n_cols])
filling = pd.DataFrame("index": rows, "col": cols, "data": np.repeat(0, n_rows * n_cols)) \
    .set_index(["index", "col"])

res = df.combine_first(filling).reset_index()

print(res)

输出

   index  col  data
0      0    0   0.0
1      0    1   0.0
2      0    2   4.0
3      1    0   1.0
4      1    1   0.0
5      1    2   0.0
6      2    0   2.0
7      2    1   0.0
8      2    2   0.0

【讨论】:

以上是关于将稀疏矩阵转换为熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

直接将 Pandas 数据帧转换为稀疏 Numpy 矩阵

将 pandas 稀疏数据帧转换为稀疏 numpy 矩阵以供 sklearn 使用?

从数据框创建稀疏矩阵

将 CountVectorizer 和 TfidfTransformer 稀疏矩阵转换为单独的 Pandas 数据帧行

将 1.2GB 的边列表转换为稀疏矩阵

将大型 csv 转换为稀疏矩阵以在 sklearn 中使用