Python 2.7 数据帧中大字符串列的高效存储

Python 2.7 数据帧中大字符串列的高效存储,python-2.7,pandas,hdf5,Python 2.7,Pandas,Hdf5,我有一个大熊猫数据框,它有一个字符串列,字符串的大小是高度倾斜的。大多数行的字符串长度小于20,但有些行的字符串长度超过2000 我使用pandas.HDFStorage.append将此数据帧存储在磁盘上,并设置min_itemsize=4000。但是,这种方法效率很低,因为hdf5文件的大小非常大,而且我们知道其中大部分是空的 是否可以为此字符串列的行分配不同的大小?也就是说,将小的min_itemsize分配给字符串较短的行,并将大的min_itemsize分配给字符串较长的行。使用HDF

我有一个大熊猫数据框,它有一个字符串列,字符串的大小是高度倾斜的。大多数行的字符串长度小于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
表存储是非常灵活的,但必须在存储上设置固定的大小

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
[13]中的
:df['A']=df['A'].astype('category'))
在[14]中:df.to_hdf('test_categorical_table.h5','df',mode='w',format='table')
在[15]:df.info()中
INT64索引:10000个条目,0到9999
数据列(共1列):
非空类别
数据类型:类别(1)
内存使用率:87.9 KB
在[18]中:ls-ltr*.h5
-rw-rw-r--1162080年8月31日06:36测试-无压缩-固定h5
-rw-rw-r--1088361年8月31日06:39测试-压缩-固定h5
-rw-rw-r--40179679年8月31日06:36试验编号压缩表h5
-rw-rw-r--259058 Aug 31 06:39测试-压缩-表h5
-rw-rw-r--339281年8月31日06:37测试分类表h5

不,这在HDFStore中是不可能的。它需要支持可变字符串存储类型,虽然在理论上可能,但在numpy中不直接支持。但压缩在这里应该有帮助。@Jeff您指的是数据的这种“是”压缩吗set@Jeff谢谢,它很有用。
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