问题 将scipy稀疏csr变换为pandas?


我用过了

sklearn.preprocessing.OneHotEncoder

转换输出的一些数据 scipy.sparse.csr.csr_matrix 如何将其与其他列合并回原始数据框?

我试着用 pd.concat 但我明白了

TypeError: cannot concatenate a non-NDFrame object

谢谢


12067
2018-05-01 14:20


起源



答案:


如果A是 csr_matrix, 您可以使用 .toarray() (还有 .todense() 产生一个 numpy  matrix,这也适用于 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。只需传递一个,就可以将其他数据转换为稀疏格式 numpy  array 到了 scipy.sparse.csr_matrix 构造函数和使用 scipy.sparse.hstack 结合(见 文档)。


12
2018-05-01 15:33



如果我的A.toarray()导致MemoryError,我该怎么办?有没有办法创建Dataframe而不将其转换回ndarray? - user77005
你可能想看看大熊猫 稀疏数据结构 - Stefan
我有可能将我的值作为新数据帧的标签传递吗?例如,如果热编码器具有从“字母”列中给出的带有'a a b b c a'的值,我的新数据帧将由letter_a,letter_b等引导,就像使用伪编码器一样? - Anne
通过将不同的参数传递给虚拟编码器来解决这个问题 - Anne


答案:


如果A是 csr_matrix, 您可以使用 .toarray() (还有 .todense() 产生一个 numpy  matrix,这也适用于 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。只需传递一个,就可以将其他数据转换为稀疏格式 numpy  array 到了 scipy.sparse.csr_matrix 构造函数和使用 scipy.sparse.hstack 结合(见 文档)。


12
2018-05-01 15:33



如果我的A.toarray()导致MemoryError,我该怎么办?有没有办法创建Dataframe而不将其转换回ndarray? - user77005
你可能想看看大熊猫 稀疏数据结构 - Stefan
我有可能将我的值作为新数据帧的标签传递吗?例如,如果热编码器具有从“字母”列中给出的带有'a a b b c a'的值,我的新数据帧将由letter_a,letter_b等引导,就像使用伪编码器一样? - Anne
通过将不同的参数传递给虚拟编码器来解决这个问题 - Anne


您还可以通过设置参数来避免首先返回稀疏矩阵 sparse 至 False 在创建编码器时。

的文件 OneHotEncoder 状态:

sparse:boolean,default = True

如果设置为True将返回稀疏矩阵,否则将返回一个数组。

然后,您可以再次调用DataFrame构造函数将numpy数组转换为DataFrame。


1
2017-11-16 08:19