为什么在 pd.DataFrame.to_hdf() 中设置 key='table' 会在生成的 hdf 中创建一个额外的空键?

Why does setting key='table' in pd.DataFrame.to_hdf() create an extra empty key in the resulting hdf?

将 pandas DataFrame 写入 hdf 时,如果 key 设置为 'table' 则生成的 hdf 包含一个空键 '/'。我尝试过的其他字符串值不会这样做,而且行为取决于键的名称似乎很奇怪。为什么会这样?

>>> import pandas as pd
>>> df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df.to_hdf('hdf1', key='a_key_that_is_not_table')
>>> df.to_hdf('hdf2', key='table')
>>> store1 = pd.HDFStore('hdf1')
>>> store2 = pd.HDFStore('hdf2')
>>> store1.keys()
['/a_key_that_is_not_table']
>>> store2.keys()
['/', '/table']

更新了示例脚本:

#!/usr/bin/python3

import pandas as pd
df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
keys = ['a_key_that_is_not_table', 'table']
for idx, key in enumerate(keys):
    filename = f'df{idx}.h5'
    df.to_hdf(filename, key=key, mode='w', format='table')
    store = pd.HDFStore(filename)
    print(f'Loop {idx}, key = {key}, store.keys() ={store.keys()}')
    store.close()

输出:

Loop 0, key = a_key_that_is_not_table, store.keys() =['/a_key_that_is_not_table']
Loop 1, key = table, store.keys() =['/', '/table']

您需要指定文件的格式。另外,我认为您需要向该函数添加“w”(写入)模式,因为默认模式设置为“a”(追加)。例如:

df.to_hdf('data.h5', key='df', mode='w')

如果您需要查看更多: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_hdf.html

每个 HDF5 文件都有一个引用为“/”的“根组”。如果您使用 HDFView 影响这两个文件,您会发现每个文件都有 1 个组(在文件 df0.h5 中命名为 '/a_key_that_is_not_table',在文件 df1.h5 中命名为 '/table'),因此,这不是 HDF5 模式的错误立场。

深入查看文件,我怀疑问题出在 PyTables 之上的 Pandas 抽象层。这两个文件具有相同的架构。在每个命名键(HDF5 组)下有一个名为 '_i_table' 的组,它有一个名为 'index' 的子组和一个名为 'table' 的数据集。可能 'table' 是保留名称,将其用作键会触发 Pandas 键名逻辑。将 'table' 更改为 'Table' 消除了 df1.h5 输出中的 '/'