首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过to_hdf将pandas dataframe对象写入hdf5会创建axis0、axis1、block0_items和block0_values,但为什么呢?

通过to_hdf将pandas dataframe对象写入hdf5会创建axis0、axis1、block0_items和block0_values,但为什么呢?
EN

Stack Overflow用户
提问于 2021-10-21 22:03:29
回答 1查看 105关注 0票数 0

我有一个名为test.csv的csv文件,其中包含以下内容:

代码语言:javascript
运行
复制
d,t,s,A,B
2021293,010000,.189545,-9.3868122,46.152637
2021293,010000,.388550,-9.3991013,46.22963
2021293,010000,.588547,-9.350419,46.189907
2021293,010000,.788544,-9.3768988,46.166893
2021293,010000,.988541,-9.3335829,46.134583
2021293,010001,.188538,-9.3287783,46.233955
2021293,010001,.388550,-9.3323059,46.203461
2021293,010001,.588547,-9.2911615,46.19883
2021293,010001,.788544,-9.322463,46.135742
2021293,010001,.988541,-9.2798738,46.236137

当我运行以下代码时:

代码语言:javascript
运行
复制
import numpy as np
import pandas as pd

csv_filename = 'test.csv'
hdf_filename = 'test.h5'

csv_data = pd.read_csv(csv_filename )
data     = pd.DataFrame.transpose(csv_data)

data.to_hdf(hdf_filename, key='foobar/data', mode='w', format='fixed')

然后通过load test.h5检查octavematlab中的hdf5文件,我在foobar.data下看到

代码语言:javascript
运行
复制
ans =

  1x1 struct array containing the fields:

    axis0
    axis1
    block0_items
    block0_values

但是,将使用hdf5文件的员工希望foobar.data.block0_values的内容可以直接在foobar.data中使用,而不必遍历foobar.data.block0_values。我该如何改变这一点?

foobar.data.block0_values的内容是

代码语言:javascript
运行
复制
foobar.data.block0_values
ans =

                 2021293                   10000                0.189545              -9.3868122               46.152637
                 2021293                   10000                 0.38855              -9.3991013                46.22963
                 2021293                   10000                0.588547               -9.350419               46.189907
                 2021293                   10000                0.788544      -9.376898799999999               46.166893
                 2021293                   10000                0.988541              -9.3335829               46.134583
                 2021293                   10001                0.188538              -9.3287783               46.233955
                 2021293                   10001                 0.38855              -9.3323059               46.203461
                 2021293                   10001                0.588547      -9.291161499999999                46.19883
                 2021293                   10001                0.788544      -9.322463000000001               46.135742
                 2021293                   10001                0.988541      -9.279873800000001               46.236137

而我希望这些内容能直接在foobar.data中出现。

EN

Stack Overflow用户

发布于 2021-10-22 16:40:57

HDF5是一个容器,而不是一个固定的格式。每个软件包都可以根据自己的需要自由地实现HDF5模式。因此,您必须了解每个包所需的HDF5模式。根据我使用Pandas的有限经验,HDF5数据总是使用您看到的模式编写的(数据集的名称为:axis0, axis1, block0_items, block0_values,有时也称为block1_items, block1_values)。如果文件需要在matlab和/或octave中工作,则需要确定他们在读取HDF5数据时所需的模式。

HDF5有两种基本数据集类型:

所有值都具有相同类型的

  1. 同构数据集: all intsfloatsstrings。这看起来像是Pandas.
  2. Heterogeneous datasets使用的方法,值保存在不同类型的列中。

数据的“挑战”是整数和浮点数的混合。这意味着您的HDF5模式有两种可能的方法:

  1. 使用dataset1中的ints和dataset2中的floats创建同构数据集(外加一些要重组的信息)。这就是Pandas approach.
  2. Create异构数据集。结果“看起来”像是HDFView中的熊猫数据帧。您可以使用PyTablesh5py包完成此操作。关键是从数据帧数据类型创建NumPy重新数组,然后将数据帧值加载到重新数组中。根据以前的HDF5经验,我“相当肯定”matlab可以像您预期的那样读取这种格式。

此示例说明如何使用这两个包创建异构数据集。唯一真正的区别是创建数据集的函数调用。(注意: Pandas使用PyTables访问HDF5,因此可能已经安装了Pandas --但您必须进行验证。)

将以下几行添加到您的示例中,以查看其工作原理:

代码语言:javascript
运行
复制
# extract column names and dtypes to create the recarray dtype
arr_dt = []   
for col in csv_data.columns:
    arr_dt.append( (col, csv_data[col].dtype) )   
nrows = csv_data.values.shape[0]    
# create an empty recarray based on Pandas dataframe row count and dtype
arr = np.empty( (nrows,), dtype=arr_dt )

# load dataframe column values into the recarray fields
for col in csv_data.columns:
    arr[col] = csv_data[col].values
    
print(arr)   

# use PyTables to write recarray to h5 file
import tables as tb
with tb.File(hdf_filename, mode='a')  as h5f:
    h5f.create_table('/tb','csv_data',obj=arr,createparents=True)
    
# use h5py to write recarray to h5 file
import h5py
with h5py.File(hdf_filename, mode='a')  as h5f:
    h5f.create_dataset('h5py/csv_data',data=arr)
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69669249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档