【问题标题】:Pandas HDFStore: changing dtype of indexesPandas HDFStore:更改索引的 dtype
【发布时间】:2015-01-16 01:28:00
【问题描述】:

在使用HDFStore.append时,是否存在控制用于存储数据帧索引的数据类型的方法?

似乎 pandas 索引总是以 64 位存储在 hdf5 文件中。我想提高存储效率并减小索引列的大小。

我有一个唯一的 3 列多索引,将它们保存为 uint64 索引在我的应用程序中会浪费大量空间:

给定以下数据框

In [15]: df.dtypes
Out[15]: indA              int32
indB              int16
indC              int8
data              float32
dtype: object

只需在HDFStore.append 之前设置df.set_index(['indA', 'indB', 'indC']) 会导致indAindBindC 在hdf5 文件中存储为Int64Col

不设置 pandas 索引而是指定 pytables 数据列:

store.append('mytable', df, data_columns=['indA', 'indB', 'indB'])

indAindBindC 与其原始 dtype 一起存储,但额外的 Int64Col 存储在 hdf5 文件中。

这并没有真正的帮助:通过存储在原始数据类型中,我为三个 ind 列保存/保存 56 位。然而,额外的(多余的)索引列需要 64 位...

有什么想法吗?

【问题讨论】:

    标签: python types pandas pytables hdfstore


    【解决方案1】:

    您的方法是正确的。数据列提供搜索能力并提供数据类型保存。索引存储目前相当固定。

    提供存储索引的选项是一个未解决的问题,请参阅here。我已经做了一些工作,但它不是高优先级的 ATM。欢迎您来看看。

    想要缩小存储空间的通常答案是使用压缩。为了节省相对较少的存储空间,您似乎跳过了很多圈,但那是 my2c。

    【讨论】:

    • 感谢您澄清杰夫。看来我在尝试优化存储效率时被冲昏了头脑:通过将我的数据列从 float64 移动到 float32 节省了大约 50% 之后,我开始了……你说得对,摆脱额外的 int64 索引是不值得:我用我正在寻找的结构构建了一个 pytables hdf5。与以索引为数据列的 HDFStore hdf5 相比,节省仅为 2% 左右。 (都是 bzip2 压缩的。) - 显然不值得麻烦。似乎压缩在添加的 int64 索引上效果非常好。
    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2021-09-18
    • 2017-05-19
    • 2022-01-10
    相关资源
    最近更新 更多