web-dev-qa-db-fra.com

transformer un rse éparse scipy en pandas?

J'ai utilisé le

sklearn.preprocessing.OneHotEncoder

pour transformer certaines données, la sortie est scipy.sparse.csr.csr_matrix comment puis-je le fusionner dans ma trame de données d'origine avec les autres colonnes?

J'ai essayé d'utiliser pd.concat mais je reçois

TypeError: cannot concatenate a non-NDFrame object

Merci

21
KillerSnail

Si A est csr_matrix, Vous pouvez utiliser .toarray() (il y a aussi .todense() qui produit un numpymatrix, qui fonctionne également pour le constructeur DataFrame):

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

Vous pouvez ensuite l'utiliser avec 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

Dans la version 0.20, pandas a introduit structures de données éparses , y compris SparseDataFrame .

Vous pouvez également passer des matrices éparses à sklearn pour éviter de manquer de mémoire lors de la reconversion en pandas. Convertissez simplement vos autres données au format clairsemé en passant un numpyarray au constructeur scipy.sparse.csr_matrix Et utilisez scipy.sparse.hstack Pour combiner (voir docs ).

32
Stefan

Vous pouvez également éviter de récupérer une matrice clairsemée en définissant le paramètre sparse sur False lors de la création de l'encodeur.

La documentation de OneHotEncoder indique:

clairsemé: booléen, par défaut = True

Renvoie une matrice clairsemée si elle est définie sur Vrai, sinon renvoie un tableau.

Ensuite, vous pouvez à nouveau appeler le constructeur DataFrame pour transformer le tableau numpy en un DataFrame.

3
scriptator