将具有层次结构的多个 pd.DataFrames 保存到 hdf5
save multiple pd.DataFrames with hierarchy to hdf5
我有多个 pd.DataFrames 具有层次结构。假设我有:
day_temperature_london_df = pd.DataFrame(...)
night_temperature_london_df = pd.DataFrame(...)
day_temperature_paris_df = pd.DataFrame(...)
night_temperature_paris_df = pd.DataFrame(...)
而且我想将它们分组到 hdf5 文件中,所以其中两个进入 'london' 组,另外两个进入 'paris' 组。
如果我使用 h5py,我会丢失 pd.DataFrame
的格式,丢失索引和列。
f = h5py.File("temperature.h5", "w")
grp_london = f.create_group("london")
day_lon_dset = grp_london.create_dataset("day", data=day_temperature_london_df)
print day_lon_dset[...]
这给了我一个 numpy 数组。有没有一种方法可以像 .to_hdf
一样存储许多具有层次结构的数据帧 - 它保留数据帧的所有属性?
我对 numpy
和 h5py
比 pandas
更熟悉。但我能够创建:
In [85]: store = pd.HDFStore('store.h5')
In [86]: store.root
Out[86]:
/ (RootGroup) ''
children := []
In [87]: store['df1']=df1
In [88]: store['group/df1']=df1
In [89]: store['group/df2']=df2
可重载查看:
In [95]: store
Out[95]:
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df1 frame (shape->[3,4])
/group/df1 frame (shape->[3,4])
/group/df2 frame (shape->[5,6])
In [96]: store.root
Out[96]:
/ (RootGroup) ''
children := ['df1' (Group), 'group' (Group)]
store._handle
详细显示文件结构。
在 shell 中,我还可以查看文件:
1431:~/mypy$ h5dump store.h5 |less
以下:
how should i use h5py lib for storing time series data
In [4]: f1 = h5py.File('store.h5')
In [5]: list(f1.keys())
Out[5]: ['df1', 'group']
In [6]: list(f1['df1'].keys())
Out[6]: ['axis0', 'axis1', 'block0_items', 'block0_values']
In [10]: list(f1['group'].keys())
Out[10]: ['df1', 'df2']
In [11]: list(f1['group/df1'].keys())
Out[11]: ['axis0', 'axis1', 'block0_items', 'block0_values']
In [12]: list(f1['group/df2'].keys())
Out[12]: ['axis0', 'axis1', 'block0_items', 'block0_values']
所以 `group/df2' 键相当于组的层次结构:
In [13]: gp = f1['group']
In [15]: gp['df2']['axis0']
Out[15]: <HDF5 dataset "axis0": shape (6,), type "<i8">
[17]: f1['group/df2/axis0']
Out[17]: <HDF5 dataset "axis0": shape (6,), type "<i8">
我们必须深入研究 HDFStore
或 Pytables
的文档或代码,看看它们是否具有 create_group
.
的等价物
我将把答案、评论和我在其他页面上找到的内容合并到这个答案中。
所以是的,在我的情况下确实不需要 h5py。
可以创建群组
import pandas as pd
s = pd.HDFStore(test.h5')
s['london/day'] = day_temperature_london_df
s['london/night'] = night_temperature_london_df
并且每个 DataFrame 都可以通过以下方式访问:
pd.read_hdf('test.h5', 'london/day')
但是不清楚如何只读取一组。这可以通过循环一个节点来完成,例如:
s = pd.HDFStore('test.h5')
[s.select(node._v_pathname) for node in s.get_node('london')]
在这种情况下,列表的每个元素都成为节点 'london'
的 DataFrame
文件结构可以调用s
查看
<class 'pandas.io.pytables.HDFStore'>
File path: store_5.h5
/london/day frame (shape->[100,2])
/london/night frame (shape->[200,1])
因此,通过这种方式,您应该能够使用 DataFrames 创建多个级别,并且能够在不丢失列、索引等的情况下读回它们。
我有多个 pd.DataFrames 具有层次结构。假设我有:
day_temperature_london_df = pd.DataFrame(...)
night_temperature_london_df = pd.DataFrame(...)
day_temperature_paris_df = pd.DataFrame(...)
night_temperature_paris_df = pd.DataFrame(...)
而且我想将它们分组到 hdf5 文件中,所以其中两个进入 'london' 组,另外两个进入 'paris' 组。
如果我使用 h5py,我会丢失 pd.DataFrame
的格式,丢失索引和列。
f = h5py.File("temperature.h5", "w")
grp_london = f.create_group("london")
day_lon_dset = grp_london.create_dataset("day", data=day_temperature_london_df)
print day_lon_dset[...]
这给了我一个 numpy 数组。有没有一种方法可以像 .to_hdf
一样存储许多具有层次结构的数据帧 - 它保留数据帧的所有属性?
我对 numpy
和 h5py
比 pandas
更熟悉。但我能够创建:
In [85]: store = pd.HDFStore('store.h5')
In [86]: store.root
Out[86]:
/ (RootGroup) ''
children := []
In [87]: store['df1']=df1
In [88]: store['group/df1']=df1
In [89]: store['group/df2']=df2
可重载查看:
In [95]: store
Out[95]:
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df1 frame (shape->[3,4])
/group/df1 frame (shape->[3,4])
/group/df2 frame (shape->[5,6])
In [96]: store.root
Out[96]:
/ (RootGroup) ''
children := ['df1' (Group), 'group' (Group)]
store._handle
详细显示文件结构。
在 shell 中,我还可以查看文件:
1431:~/mypy$ h5dump store.h5 |less
以下:
how should i use h5py lib for storing time series data
In [4]: f1 = h5py.File('store.h5')
In [5]: list(f1.keys())
Out[5]: ['df1', 'group']
In [6]: list(f1['df1'].keys())
Out[6]: ['axis0', 'axis1', 'block0_items', 'block0_values']
In [10]: list(f1['group'].keys())
Out[10]: ['df1', 'df2']
In [11]: list(f1['group/df1'].keys())
Out[11]: ['axis0', 'axis1', 'block0_items', 'block0_values']
In [12]: list(f1['group/df2'].keys())
Out[12]: ['axis0', 'axis1', 'block0_items', 'block0_values']
所以 `group/df2' 键相当于组的层次结构:
In [13]: gp = f1['group']
In [15]: gp['df2']['axis0']
Out[15]: <HDF5 dataset "axis0": shape (6,), type "<i8">
[17]: f1['group/df2/axis0']
Out[17]: <HDF5 dataset "axis0": shape (6,), type "<i8">
我们必须深入研究 HDFStore
或 Pytables
的文档或代码,看看它们是否具有 create_group
.
我将把答案、评论和我在其他页面上找到的内容合并到这个答案中。
所以是的,在我的情况下确实不需要 h5py。
可以创建群组import pandas as pd
s = pd.HDFStore(test.h5')
s['london/day'] = day_temperature_london_df
s['london/night'] = night_temperature_london_df
并且每个 DataFrame 都可以通过以下方式访问:
pd.read_hdf('test.h5', 'london/day')
但是不清楚如何只读取一组。这可以通过循环一个节点来完成,例如:
s = pd.HDFStore('test.h5')
[s.select(node._v_pathname) for node in s.get_node('london')]
在这种情况下,列表的每个元素都成为节点 'london'
的 DataFrame文件结构可以调用s
<class 'pandas.io.pytables.HDFStore'>
File path: store_5.h5
/london/day frame (shape->[100,2])
/london/night frame (shape->[200,1])
因此,通过这种方式,您应该能够使用 DataFrames 创建多个级别,并且能够在不丢失列、索引等的情况下读回它们。