使用Pandas表格模式创建HDF5文件时出现奇怪的IndexError
使用pandas写入HDF5表格模式时触发IndexError的问题
问题场景
通过store.put()以表格模式写入HDF5文件时出现IndexError,执行代码如下:
storage_file.put(some_name, current_dataset.meta_data, format="table", data_columns=True, min_itemsize={"values": 100})
其中meta_data是一个Pandas DataFrame,列名列表为:
[ 'index', 'xPosition', 'yPosition', 'approachID', 'segment_0_type', 'segment_0_style', 'segment_0_duration', 'segment_0_num_points', 'segment_0_z_start', 'segment_0_z_end', 'segment_0_setpoint', 'segment_1_type', 'segment_1_style', 'segment_1_duration', 'segment_1_num_points', 'segment_1_z_start', 'segment_1_z_end', 'segment_1_setpoint', 'segment_2_type', 'segment_2_style', 'segment_2_duration', 'segment_2_num_points', 'segment_2_height_limit', 'pauseBeforeFirst', 'pauseOnTipsaver', 'segmentIndex', 'heightMultiplier', 'heightOffset', 'sensitivity', 'springConstant', 'measurementID' ]
错误信息
触发的错误提示:
IndexError: tuple index out of range
报错栈指向pandas内部代码:
File "PATH\Lib\site-packages\pandas\io\pytables.py", line 4473, in write_data new_shape = (nrows,) + self.dtype[names[nindexes + i]].shape
排查发现
- 将列名改为
["0", "1", ..., "30"]这类纯数字字符串时,错误消失。 - 列名长度不是问题:曾将每个列名改为25个相同数字组成的长字符串(代码如下),能正常运行:
for index in range(meta_data.shape[1]): meta_data.rename({meta_data.columns[index]: "".join([str(index) for i in range(25)])}, axis=1, inplace=True)
问题原因
这个错误是因为你的DataFrame列名中包含了index,而Pandas在处理HDF5表格模式时,会把名为index的列和DataFrame自身的索引逻辑混淆,导致内部代码在计算列名索引位置时出现逻辑冲突,最终触发IndexError。
Pytables写入表格时会区分DataFrame的索引列与普通数据列,当存在名为index的自定义列时,内部列名解析逻辑会出现混乱,使得names[nindexes + i]的索引值超出列表范围,进而报错。
解决方案
直接将DataFrame中名为index的列重命名为其他非关键字名称即可,比如data_index:
meta_data.rename(columns={'index': 'data_index'}, inplace=True)
修改后再执行store.put()操作即可正常写入HDF5文件。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

