如何向存储在HDFStore文件中的面板追加数据

3 投票
1 回答
688 浏览
提问于 2025-04-18 06:16

我有一个面板(Panel)存储在一个文件里,我想往这个面板里添加更多的数据。把数据添加到内存里是没问题的,但当我尝试把数据添加到文件时,就出现了这个错误:

import pandas as pd
import numpy as np

df = pd.DataFrame(data = np.random.randn(5,6),columns=('a','b','c','d','e','f'))
pw =  pd.Panel(major_axis = df.columns,minor_axis=df.index)
pw2 = pd.Panel(major_axis = df.columns,minor_axis=df.index)
pw['A'] = df
pw['B'] = df*2
pw['C'] = df*3
pw2['D'] = df*4

pw.to_hdf('proc.h5','proc' , mode='w',format='table',append=True)
pw2.to_hdf('proc.h5','proc' , mode='a',format='table',append=True)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 884, in to_hdf
return pytables.to_hdf(path_or_buf, key, self, **kwargs)
File "C:\Python27\lib\site-packages\pandas\io\pytables.py", line 279, in to_hdf
f(store)
File "C:\Python27\lib\site-packages\pandas\io\pytables.py", line 272, in <lambda>
f = lambda store: store.append(key, value, **kwargs)
File "C:\Python27\lib\site-packages\pandas\io\pytables.py", line 914, in append
**kwargs)
File "C:\Python27\lib\site-packages\pandas\io\pytables.py", line 1273, in _write_to_group
s.write(obj=value, append=append, complib=complib, **kwargs)
File "C:\Python27\lib\site-packages\pandas\io\pytables.py", line 3578, in write
**kwargs)
File "C:\Python27\lib\site-packages\pandas\io\pytables.py", line 3229, in create_axes
item in items))
ValueError: cannot match existing table structure for [A,B,C] on appending data

1 个回答

1

关于 axes 参数的说明可以在 这里 找到。

当你存储一个超过两维的对象(比如一个三维的 Panel),它会被压缩成一个表格结构。在这个表格中,major_axisminor_axis 就是索引,而 items 轴则是表格中的“列”。

所以,你可以在任何索引上添加内容,这意味着你可以添加一个新的面板,尽管它的主要或次要轴发生了变化。不过,items 轴在第一次添加表格时是固定的。

为了提高效率,PyTables/HDF5 需要这个固定的维度。

如果你想的话,可以指定不同的轴来添加,比如 axes=['items','major_axis'],或者简单地转置面板,以便得到你需要的形式。这个参数必须在第一次添加时指定。

你可以通过 ptdump -av <file.h5> 来查看创建的结构。

撰写回答