【问题标题】:sparse versions of Pandas DataFramePandas DataFrame 的稀疏版本
【发布时间】:2015-04-30 03:43:03
【问题描述】:

我对这个页面上给出的 pandas 中SparseDataFrame 的描述有点困惑:Sparse Data Frame,尤其是它的例子。

考虑一个时间序列及其假设的稀疏表示:

x = [0, 0, 1, 0, 0, 3, 0, 0, 0, 5, 0]

xs = [(2, 5), (5, 3), (9, 5)]

问题:

(i) 如果我从 xs 创建一个 SparseDataFrame,它 (a) 是否实际上将 xs 保存在内存中或 x 保存在内存中,或者 (b) 将 x 保存在内存中,但仅选择到磁盘时保存xs

(ii) 我可以创建一些列稀疏而一些列密集的 pandas 数据框吗?

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    它将根据 memory_usage() 按列显示内存使用情况来节省内存,或者您可以通过 info() 查看整个数据帧的总内存使用情况。

    df = pd.DataFrame({ 'x':[0, 0, 1, 0, 0, 3, 0, 0, 0, 5, 0] })
    
    sdf = df.to_sparse(fill_value=0)
    
    df.memory_usage()
    
    x    88
    dtype: int64
    
    sdf.memory_usage()
    
    x    24
    dtype: int64
    

    有点意思,数据的底层形状似乎隐藏在数据帧级别:

    df.shape
    (11, 1)
    
    sdf.shape
    (11, 1)
    

    但暴露在列级:

    df['x'].shape
    (11,)
    
    sdf['x'].shape
    (3,)
    

    我想不出将标准列和稀疏列组合在同一个数据框中的方法,但我当然不是这方面的专家,所以我不知道这是否可能。但据我所知,稀疏数据帧只是“类似ndarray”对象的包装器,所以我认为你需要坚持使用本质上是同质numpy数组的数据帧。

    我最近没有玩过它,但我认为 bcolz 在这里更灵活(在混合 dtypes 方面),但显然不能为您提供所有 pandas 数据框的便利。

    但是,只要您将列分开,您似乎确实可以以标准的 pandasic 方式做很多事情,尽管不是全部:

    df = pd.DataFrame({ 'x':[0, 0, 1, 0, 0, 3, 0, 0, 0, 5, 0], 
                        'y':[0, 2, 0, 0, 0, 3, 0, 1, 0, 0, 0] })
    
    sdf = df.to_sparse(fill_value=0)
    
    df + sdf                 # works 
    
    df['x'] + sdf['x']       # works
    
    df['x'] + sdf['y']       # doesn't work, b/c shapes different?
    

    但你可以这样做:

    df['x'] + sdf['y'].to_dense()
    

    不太方便,但也不算太差,而且总体上仍可能节省内存,因为您必须暂时扩展一列 sdf,而不是整个 sdf 数据帧。

    【讨论】:

    • 谢谢。我不知道memory_usage() 函数
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    相关资源
    最近更新 更多