2016-05-01 26 views
6

Ho usato iltrasformare scsy sparse csr in panda?

sklearn.preprocessing.OneHotEncoder 

di trasformare alcuni dati l'uscita è scipy.sparse.csr.csr_matrix come posso unire di nuovo nella mia dataframe originale insieme con le altre colonne?

Ho provato ad usare pd.concat ma ho

TypeError: cannot concatenate a non-NDFrame object 

Grazie

risposta

8

Se A è csr_matrix, è possibile utilizzare .toarray() (c'è anche .todense() che produce un numpymatrix, che è anche lavora per il DataFrame costruttore):

df = pd.DataFrame(A.toarray()) 

Si c a quindi utilizzare questo con pd.concat().

A = csr_matrix([[1, 0, 2], [0, 3, 0]]) 

    (0, 0) 1 
    (0, 2) 2 
    (1, 1) 3 

<class 'scipy.sparse.csr.csr_matrix'> 

pd.DataFrame(A.todense()) 

    0 1 2 
0 1 0 2 
1 0 3 0 

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 2 entries, 0 to 1 
Data columns (total 3 columns): 
0 2 non-null int64 
1 2 non-null int64 
2 2 non-null int64 

Nella versione 0.20, pandas introdotto sparse data structures, compreso il SparseDataFrame.

In alternativa, è possibile passare le matrici sparse a sklearn per evitare l'esaurimento della memoria durante la riconversione allo pandas. Basta convertire gli altri dati nel formato sparse passando un numpy al costruttore scipy.sparse.csr_matrix e utilizzare scipy.sparse.hstack da combinare (vedere docs).

+0

Cosa posso fare se il mio A.toarray() conduce a un MemoryError? C'è un modo per creare il Dataframe senza convertirlo in un narray? – user77005

+0

Puoi dare un'occhiata ai panda [sparse data structures] (https://pandas.pydata.org/pandas-docs/stable/sparse.html) – Stefan

1

È anche possibile evitare di ripristinare una matrice sparsa in primo luogo impostando il parametro sparse su False durante la creazione dell'encoder.

La documentazione dei OneHotEncoder stati:

sparse: booleano, default = true

tornerà matrice sparsa se impostato Vero altro restituirà un array.

Quindi è possibile chiamare di nuovo il costruttore DataFrame per trasformare l'array numpy in un DataFrame.