scipy 将稀疏矩阵转换为Pandas Dataframe

dtcbnfnu  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(206)
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矩阵转换为 Dataframe ,其中列表示矩阵的索引、列和数据。
唯一的问题是,我在上面尝试的操作不能为值为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

您将看到上面的代码片段取自this answer in this thread

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

5n0oy7gb

5n0oy7gb1#

一种方法是创建一个filling DataFrame,并将其与已有的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
9fkzdhlc

9fkzdhlc2#

  • 将稀疏矩阵转换为密集矩阵以填充0
  • 将稠密矩阵转换为Pandas Dataframe
  • melt Dataframe 从“宽”格式更改为“长”格式
df = your_sparse_matrix_data.todense()
(pd.DataFrame(df)
    .melt()
    .reset_index()
    .rename(columns = {'index':'row','variable':'column'}))

相关问题