Pandas稀疏数据帧在磁盘上比密集版本大

2024-09-29 01:27:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现数据帧的稀疏版本在保存到磁盘时实际上要比密集版本大得多。我做错什么了?在

test = pd.DataFrame(ones((4,4000)))
test.ix[:,:] = nan
test.ix[0,0] = 47

test.to_hdf('test3', 'df')
test.to_sparse(fill_value=nan).to_hdf('test4', 'df')

test.to_pickle('test5')
test.to_sparse(fill_value=nan).to_pickle('test6')

....
ls -sh test*
200K test3   16M test4  164K test5  516K test6

使用版本0.12.0

我最终希望高效地存储10^7×60阵列,密度约为10%,然后将它们拉入Pandas数据帧中并与它们一起玩。在


编辑:感谢杰夫回答了最初的问题。后续问题:这似乎只节省酸洗,而不是使用其他格式,如HDF5。酸洗是我最好的方法吗?在

^{pr2}$

这些数据,作为Matlab.mat文件中的一个索引列表,不到12M。我很想把它转换成HDF5/Pytables格式,这样我就可以只抓取特定的索引(其他文件要大得多,加载到内存中的时间要长得多),然后就可以轻松地对它们执行panday操作。也许我做这件事的方式不对?在


Tags: to数据test版本dfvaluenanfill
1条回答
网友
1楼 · 发布于 2024-09-29 01:27:30

您正在创建一个有4000列,只有4行的框架;稀疏是按行处理的,因此请反转维度。在

In [2]: from numpy import *

In [3]: test = pd.DataFrame(ones((4000,4)))

In [4]: test.ix[:,:] = nan

In [5]: test.ix[0,0] = 47

In [6]: test.to_hdf('test3', 'df')

In [7]: test.to_sparse(fill_value=nan).to_hdf('test4', 'df')

In [8]: test.to_pickle('test5')

In [9]: test.to_sparse(fill_value=nan).to_pickle('test6')

In [11]: !ls -sh test3 test4 test5 test6
164K test3  148K test4  160K test5   36K test6

跟进。您提供的存储是以table格式编写的,因此保存了密集版本(非常灵活和可查询的表格式不支持稀疏格式,请参见docs。在

此外,您可能希望尝试使用两种不同的稀疏格式表示来保存文件。在

下面是一个示例会话:

^{pr2}$

IIRC their是0.12中的一个错误,因为to_hdf没有传递所有参数,因此您可能希望使用:

with get_store('test.h5',mode='w',complib='blosc',complevel=9) as store:
    store.put('test',df)

它们基本上存储为SparseSeries的集合,因此如果密度低且不连续,那么它就不会像大小一样最小。熊猫稀疏套房更好地处理较少的相邻区块,尽管YMMV。scipy还提供了一些稀疏的处理工具。在

尽管IMHO,这些对于HDF5文件来说都是非常小的大小,但是您可以处理大量的行;并且文件大小可以轻松处理到10和100千兆字节(尽管推荐)。在

此外,如果这确实是一个可以查询的查找表,则可以考虑使用表格式。在

相关问题 更多 >