为什么在 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 输出中的 '/'
。
将 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 输出中的 '/'
。