[试图打开h5py中的熊猫创建的hdf时缺少列

问题描述 投票:1回答:1

这是我的数据框的外观。第一列是单个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 hdfs hdf5 h5py pytables
1个回答
1
投票

问题是您要序列化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,这只是一个字节的字节。

以下是一些可以解决此问题的方法:

  1. 将每一行存储在HDF5中的单独键下。也就是说,每个列表将存储为一个数组,并且它们都可以具有不同的长度。 HDF5没问题,因为它在一个文件中支持任意数量的密钥。
  2. 例如,将数据更改为矩形通过用零填充较短的列表。请参阅:Pandas split column of lists into multiple columns
  3. 使用h5py以您喜欢的任何格式写入数据。与Pandas / PyTables相比,它更加灵活,可创建更简单(但功能更强大)的HDF5文件。这是一个示例(尽管h5py不够漂亮,但它实际上可以存储锯齿状数组):Storing multidimensional variable length array with h5py
© www.soinside.com 2019 - 2024. All rights reserved.