Jak*_*x32 13 python scipy sparse-matrix pandas
有没有办法从a转换pandas.SparseDataFrame
为scipy.sparse.csr_matrix
,而不在内存中生成密集矩阵?
scipy.sparse.csr_matrix(df.values)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它产生一个密集的矩阵,投射到csr_matrix
.
提前致谢!
T.C*_*tor 14
截至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)
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 月)。
归档时间: |
|
查看次数: |
8815 次 |
最近记录: |