web-dev-qa-db-ja.com

scipy sparse csrをpandasに変換しますか?

私は使用しました

sklearn.preprocessing.OneHotEncoder

一部のデータを変換するために、出力はscipy.sparse.csr.csr_matrixで、他の列とともに元のデータフレームにマージする方法

pd.concatを使用しようとしましたが、

TypeError: cannot concatenate a non-NDFrame object

ありがとう

21
KillerSnail

Aがcsr_matrixの場合、 .toarray() を使用できます(numpymatrixを生成する.todense()もあります。 DataFrameコンストラクターの場合):

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

その後、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

バージョン0.20では、pandasが導入されました スパースデータ構造SparseDataFrame を含む。

または、スパース行列をsklearnに渡して、pandasに戻すときにメモリが不足しないようにすることができます。 numpyarrayscipy.sparse.csr_matrixコンストラクターに渡して他のデータをスパース形式に変換し、scipy.sparse.hstackを使用して結合します( docs を参照)。

32
Stefan

エンコーダーを作成するときにパラメーターsparseFalseに設定することで、そもそもスパース行列が戻らないようにすることもできます。

OneHotEncoder 状態のドキュメント:

sparse:ブール値、デフォルト= True

Trueに設定されている場合はスパース行列を返し、そうでない場合は配列を返します。

その後、再びDataFrameコンストラクターを呼び出して、numpy配列をDataFrameに変換できます。

3
scriptator