这是我的数据框的外观。第一列是单个int。第二列是512个整数的单个列表。
IndexID Ids
1899317 [0, 47715, 1757, 9, 38994, 230, 12, 241, 12228...
22861131 [0, 48156, 154, 6304, 43611, 11, 9496, 8982, 1...
2163410 [0, 26039, 41156, 227, 860, 3320, 6673, 260, 1...
15760716 [0, 40883, 4086, 11, 5, 18559, 1923, 1494, 4, ...
12244098 [0, 45651, 4128, 227, 5, 10397, 995, 731, 9, 3...
我将其保存到hdf,并尝试使用打开它
df.to_hdf('test.h5', key='df', data_columns=True)
h3 = h5py.File('test.h5')
列出按键时我看到4个按键
h3['df'].keys()
KeysViewHDF5 ['axis0','axis1','block0_items','block0_values']
Axis1似乎包含第一列的值
h3['df']['axis1'][0:5]
array([1899317,22861131,2163410,15760716,12244098,
但是,似乎第二列中没有数据。确实有另一列包含其他数据
h3['df']['block0_values'][0][0:5]
但是这似乎与第二列中的任何数据都不对应
array([128,4,149,1,0],dtype = uint8)
我最终试图创建一个内存映射的数据存储,该数据库使用特定的索引来检索数据。
所以类似
h3['df']['workingIndex'][22861131, 15760716]
将检索
[0, 48156, 154, 6304, 43611, 11, 9496, 8982, 1...],
[0, 40883, 4086, 11, 5, 18559, 1923, 1494, 4, ...
问题是您要序列化Pandas系列的Python列表,它不是矩形的(锯齿状的。)>]
Pandas和HDF5主要用于矩形(立方体,超立方体等)数据,而不是锯齿状的列表。
呼叫to_hdf()
时看到此警告了吗?
PerformanceWarning: your performance may suffer as PyTables will pickle object types that it cannot map directly to c-types [inferred_type->mixed,key->block0_values] [items->['Ids']]
试图告诉您的是,不以直观,高性能的方式支持列表列表。而且,如果您在输出文件上运行HDF5可视化工具,例如
h5dump
,您会发现问题所在。索引(行为良好)如下所示:
DATASET "axis1" { DATATYPE H5T_STD_I64LE DATASPACE SIMPLE { ( 5 ) / ( 5 ) } DATA { (0): 1899317, 22861131, 2163410, 15760716, 12244098 } ATTRIBUTE "CLASS" { DATA { (0): "ARRAY" } }
但是值(列表列表)看起来像这样:
DATASET "block0_values" { DATATYPE H5T_VLEN { H5T_STD_U8LE} DATASPACE SIMPLE { ( 1 ) / ( H5S_UNLIMITED ) } DATA { (0): (128, 5, 149, 164, ...) } ATTRIBUTE "CLASS" { DATA { (0): "VLARRAY" } } ATTRIBUTE "PSEUDOATOM" { DATA { (0): "object" } }
发生的正是PerformanceWarning警告您的警告:
> PyTables will pickle object types that it cannot map directly to c-types
您的列表列表将被腌制并存储为H5T_VLEN,这只是一个字节的字节。
以下是一些可以解决此问题的方法: