Pandas稀疏dataFrame到稀疏矩阵,而不在内存中生成密集矩阵

Jak*_*x32 13 python scipy sparse-matrix pandas

有没有办法从a转换pandas.SparseDataFramescipy.sparse.csr_matrix,而不在内存中生成密集矩阵?

scipy.sparse.csr_matrix(df.values)
Run Code Online (Sandbox Code Playgroud)

不起作用,因为它产生一个密集的矩阵,投射到csr_matrix.

提前致谢!

T.C*_*tor 14

熊猫0.20.0+:

截至2017年5月5日发布的pandas版本0.20.0,有一个单行:

from scipy import sparse


def sparse_df_to_csr(df):
    return sparse.csr_matrix(df.to_coo())
Run Code Online (Sandbox Code Playgroud)

这使用了新to_coo()方法.

早期版本:

在Victor May的答案的基础上,这里的实现稍微快一些,但只有在全部SparseDataFrame稀疏的情况下它才有效BlockIndex(注意:如果它是用它创建的get_dummies,那就是这种情况).

编辑:我修改了这个,所以它将使用非零填充值.CSR没有本地非零填充值,因此您必须在外部进行记录.

import numpy as np
import pandas as pd
from scipy import sparse

def sparse_BlockIndex_df_to_csr(df):
    columns = df.columns
    zipped_data = zip(*[(df[col].sp_values - df[col].fill_value,
                         df[col].sp_index.to_int_index().indices)
                        for col in columns])
    data, rows = map(list, zipped_data)
    cols = [np.ones_like(a)*i for (i,a) in enumerate(data)]
    data_f = np.concatenate(data)
    rows_f = np.concatenate(rows)
    cols_f = np.concatenate(cols)
    arr = sparse.coo_matrix((data_f, (rows_f, cols_f)),
                            df.shape, dtype=np.float64)
    return arr.tocsr()
Run Code Online (Sandbox Code Playgroud)


hpa*_*ulj 1

Pandas 文档讨论了到 scipy稀疏的实验性转换,SparseSeries.to_coo:

http://pandas-docs.github.io/pandas-docs-travis/sparse.html#interaction-with-scipy-sparse

===============

编辑 - 这是多重索引的特殊功能,而不是数据框。请参阅其他答案。请注意日期的差异。

===========

从 0.20.0 开始,有 asdf.to_coo()和 multiindex ss.to_coo()。由于稀疏矩阵本质上是二维的,因此(实际上)一维数据系列需要多索引是有意义的。而数据框可以表示表格或二维数组。

当我第一次回答这个问题时,这个稀疏数据帧/系列功能是实验性的(2015 年 6 月)。