Pandas 0.20.0+:
Come di panda versione 0.20.0, rilasciata 5 Maggio 2017, v'è un one-liner per questo:
from scipy import sparse
def sparse_df_to_csr(df):
return sparse.csr_matrix(df.to_coo())
Questo utilizza la nuovo to_coo()
method.
versioni precedenti:
edificio sulla risposta di Victor maggio, ecco un'implementazione leggermente più veloce, ma funziona solo se l'intera SparseDataFrame
è sparsa con tutto BlockIndex
(nota: se è stato creato con get_dummies
, questo sarà il Astuccio).
Modifica: Ho modificato questo in modo che funzioni con un valore di riempimento diverso da zero. La CSR non ha un valore di riempimento nativo diverso da zero, quindi dovrai registrarlo esternamente.
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()
fonte
2016-07-02 06:31:59
Esegui questo al contrario? http://stackoverflow.com/questions/17818783/populate-a-pandas-sparsedataframe-from-a-scipy-sparse-matrix – JohnE