【问题标题】:transform scipy sparse csr to pandas?将 scipy 稀疏 csr 转换为熊猫?
【发布时间】:2016-08-26 08:18:24
【问题描述】:

我用过

sklearn.preprocessing.OneHotEncoder

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

我尝试使用pd.concat,但我得到了

TypeError: cannot concatenate a non-NDFrame object

谢谢

【问题讨论】:

    标签: python pandas machine-learning scipy scikit-learn


    【解决方案1】:

    如果 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 引入了sparse data structures,包括SparseDataFrame

    在 pandas 1.0 中,SparseDataFrameremoved

    在旧版本的 pandas 中,SparseSeriesSparseDataFrame 类是处理稀疏数据的首选方式。随着扩展数组的出现,不再需要这些子类。使用具有稀疏值的常规 Series 或 DataFrame 可以更好地实现它们的目的。

    migration 指南展示了如何使用这些新的数据结构。

    例如,从稀疏矩阵创建DataFrame

    from scipy.sparse import csr_matrix
    
    A = csr_matrix([[1, 0, 2], [0, 3, 0]])
    
    df = pd.DataFrame.sparse.from_spmatrix(A, columns=['A', 'B', 'C'])
    
    df
    
       A  B  C
    0  1  0  2
    1  0  3  0
    
    df.dtypes
    A    Sparse[float64, 0]
    B    Sparse[float64, 0]
    C    Sparse[float64, 0]
    dtype: object
    

    或者,您可以将稀疏矩阵传递给sklearn,以避免在转换回pandas 时内存不足。只需将 numpy array 传递给 scipy.sparse.csr_matrix 构造函数,然后使用 scipy.sparse.hstack 进行组合,即可将其他数据转换为稀疏格式(请参阅 docs)。

    【讨论】:

    • 如果我的 A.toarray() 导致 MemoryError,我该怎么办?有什么方法可以在不将其转换回 ndarray 的情况下创建 Dataframe?
    • 你可能想看看熊猫sparse data structures
    • 有没有机会我可以将我的值作为新数据框的标签传递?例如,如果热编码器具有从列“字母”和“a a b b c a”给出的值,那么我的新数据帧将以 letter_a、letter_b 等为首,就像使用虚拟编码器一样?
    • 通过将不同的参数传递给虚拟编码器解决了这个问题
    • 警告:如果稀疏矩阵太大,会抛出内存错误,因为.toarray() 创建了一个密集矩阵。
    【解决方案2】:

    熊猫 1.0+ 更新

    根据 Pandas Sparse data structures 文档,SparseDataFrameSparseSeries 已被删除。

    稀疏 Pandas 数据帧

    以前的方式

    pd.SparseDataFrame({"A": [0, 1]})
    

    新方式

    pd.DataFrame({"A": pd.arrays.SparseArray([0, 1])})
    

    使用 SciPy 稀疏 csr_matrix

    以前的方式

    from scipy.sparse import csr_matrix
    matrix = csr_matrix((3, 4), dtype=np.int8)
    df = pd.SparseDataFrame(matrix, columns=['A', 'B', 'C'])
    

    新方式

    from scipy.sparse import csr_matrix
    import numpy as np
    import pandas as pd
    
    matrix = csr_matrix((3, 4), dtype=np.int8)
    df = pd.DataFrame.sparse.from_spmatrix(matrix, columns=['A', 'B', 'C', 'D'])
    df.dtypes
    

    输出:

    A    Sparse[int8, 0]
    B    Sparse[int8, 0]
    C    Sparse[int8, 0]
    D    Sparse[int8, 0]
    dtype: object
    

    从稀疏到密集的转换

    df.sparse.to_dense()                                                                                                                                                                            
    

    输出:

       A  B  C  D
    0  0  0  0  0
    1  0  0  0  0
    2  0  0  0  0
    

    稀疏属性

    df.sparse.density                                                                                                                                                                           
    

    输出:

    0.0
    

    【讨论】:

      【解决方案3】:

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

      OneHotEncoder 的文档指出:

      稀疏:布尔值,默认=True

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

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

      【讨论】:

        猜你喜欢
        • 2020-09-04
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2018-11-12
        • 2016-10-29
        • 2020-11-26
        相关资源
        最近更新 更多