在熊猫数据框中高效存储大字符串列

麦可

我有一个大的pandas数据框,其中的字符串列在字符串大小上有很大的偏斜。大多数行的字符串长度<20,但是有些行的字符串长度大于2000。

我使用pandas.HDFStorage.append将此数据帧存储在磁盘上,并设置min_itemsize =4000。但是,此方法效率极低,因为hdf5文件的大小非常大,而且我们知道其中大多数是空的。

是否可以为此字符串列的行分配不同的大小?即,将min_itemsize小分配给字符串短的行,将min_itemsize大分配给字符串长的行。

杰夫

当使用HDFStore存储的字符串,在列的字符串的最大长度是该特定列中的宽度,这可定制,见这里

有几种选项可用于处理各种情况。压缩可以有很大帮助。

In [6]: df = DataFrame({'A' : ['too']*10000})

In [7]: df.iloc[-1] = 'A'*4000

In [8]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10000 entries, 0 to 9999
Data columns (total 1 columns):
A    10000 non-null object
dtypes: object(1)
memory usage: 156.2+ KB

这些是固定存储,字符串存储为object类型,因此其性能不是特别好;这些商店也不可用于查询/附加。

In [9]: df.to_hdf('test_no_compression_fixed.h5','df',mode='w',format='fixed')

In [10]: df.to_hdf('test_no_compression_table.h5','df',mode='w',format='table')

表格存储非常灵活,但是在存储上强制使用固定大小。

In [11]: df.to_hdf('test_compression_fixed.h5','df',mode='w',format='fixed',complib='blosc')

In [12]: df.to_hdf('test_compression_table.h5','df',mode='w',format='table',complib='blosc')

通常,使用分类表示可提供运行时和存储效率。

In [13]: df['A'] = df['A'].astype('category') 

In [14]: df.to_hdf('test_categorical_table.h5','df',mode='w',format='table')

In [15]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10000 entries, 0 to 9999
Data columns (total 1 columns):
A    10000 non-null category
dtypes: category(1)
memory usage: 87.9 KB

In [18]: ls -ltr *.h5
-rw-rw-r--     1162080 Aug 31 06:36 test_no_compression_fixed.h5
-rw-rw-r--     1088361 Aug 31 06:39 test_compression_fixed.h5
-rw-rw-r--    40179679 Aug 31 06:36 test_no_compression_table.h5
-rw-rw-r--      259058 Aug 31 06:39 test_compression_table.h5
-rw-rw-r--      339281 Aug 31 06:37 test_categorical_table.h5

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章