HDF5:有没有办法重命名现有 HDF5 表中的列名?

Posted

技术标签:

【中文标题】HDF5:有没有办法重命名现有 HDF5 表中的列名?【英文标题】:HDF5: Is there a way to rename the column names in an existing HDF5 table? 【发布时间】:2016-12-08 01:54:31 【问题描述】:

我使用 Pandas 创建了一个大型索引 HDF5 表。我想重命名表中 12 列中的 2 列。我不想重建/重新索引表。

这可以在不复制所有数据(140GB)的情况下完成吗?我希望文件中只有几条元数据可以使用正确的命令轻松换出。

这对我来说是因为我有一些带有空格的“非自然”列名,并且直到尝试运行 select 语句时才意识到这是一个问题。

【问题讨论】:

AFAIK 目前还没有“公平”的方式来做到这一点,但您可以使用 this Jeff's hack 好主意——不过似乎对我不起作用,也许是因为我有一个索引表。我根据 Jeff 的 hack 修改了我能找到的所有“attrs”元数据——包括为我出现的一些额外字段——但“select”仍然无法识别新的列名。当我执行 s.get_storer('all').table.colindexes 时,我看到列仍然使用旧名称命名。 是的,使用索引列,您有更多的“作业”...检查store.get_storer('all') 以获取要重命名的列并尝试重命名它们。也看看PyTables's _f_rename() method 是的,我做了所有这些,但我找不到合适的位置。查看 store.get_storer('all') 看起来像是我重命名了所有列。但是,store.get_storer('all').table 会同时生成具有旧名称的“tables.description.Description”对象和“tables.table._ColIndexes”对象(即使在关闭/打开商店之后)。我不确定这些 Table 内部的东西从哪里得到列名,但它不是在任何明显的(对我而言)可通过 store.get_storer('all').table.attrs 访问的地方——所有这些元数据(包括属性等因为“COL NAME_dtype”有我的新列名。 【参考方案1】:

恐怕目前没有办法重命名索引(属于data_columns)列,因为这需要在storer.table.colindexesstorer.table.description对象中进行更改,并且它们都是特定类型的:

In [29]: store.get_storer('df').table
Out[29]:
/df/table (Table(10,)) ''
  description := 
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "a": Int32Col(shape=(), dflt=0, pos=1),
  "b": Int32Col(shape=(), dflt=0, pos=2),
  "c": Int32Col(shape=(), dflt=0, pos=3)
  byteorder := 'little'
  chunkshape := (3276,)
  autoindex := True
  colindexes := 
    "a": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "c": Index(6, medium, shuffle, zlib(1)).is_csi=False,
    "b": Index(6, medium, shuffle, zlib(1)).is_csi=False

In [30]: type(store.get_storer('df').table.colindexes)
Out[30]: tables.table._ColIndexes

In [31]: type(store.get_storer('df').table.description)
Out[31]: tables.description.Description

如果您尝试用谷歌搜索 PyTables 解决方案,您会发现这个问题,但没有/没有答案可以让您重命名列。

因此您可能需要重新创建 HDF5 文件

【讨论】:

是的,我也得出了同样的结论。我想知道这是否是 PyTables 或 HDF5 的限制。但目前看来唯一的解决方案是重新创建文件。

以上是关于HDF5:有没有办法重命名现有 HDF5 表中的列名?的主要内容,如果未能解决你的问题,请参考以下文章

查看 HDF5 表中的列

为大型 hdf5 文件重命名组中的所有 HDF5 数据集时出现问题

有没有办法让一个 numpy 样式的视图查看存储在 hdf5 文件中的数组切片?

如何在现有 HDF5 文件上创建组? (HDF5)

使用 Pandas、Python 将数据附加到 HDF5 文件

搜索 HDF5 数据集