使用Pandas将txt转HDF5时,部分0.05变为0.05.1的问题排查
问题根源与解决方案
根本原因
问题出在Pandas读取CSV时的重复列名处理逻辑:当你的txt文件中存在重复的列名(比如多个列都叫0.05),Pandas会自动给后续的重复列名添加.1、.2这类后缀,导致保存到HDF5后出现0.05.1这种列名。你用h5py读取列名并尝试转成float时,自然会触发格式错误。
根本解决方法(推荐)
从源头处理重复列名,避免Pandas自动生成后缀:
- 先检查原txt文件的表头,确认是否有重复的
0.05列名。 - 手动处理重复列名后再读取CSV:
# 读取原文件的表头行 with open('/path/to/file.txt', 'r') as f: header = f.readline().strip().split(',') # 给重复列名添加自定义区分后缀 from collections import defaultdict col_count = defaultdict(int) cleaned_header = [] for col in header: if col_count[col] > 0: cleaned_header.append(f"{col}_{col_count[col]}") else: cleaned_header.append(col) col_count[col] += 1 # 用处理后的列名读取CSV并保存HDF5 df = pd.read_csv('/path/to/file.txt', names=cleaned_header, header=0) df.to_hdf('/path/to/file.hdf5', key='data', mode='w')
这样保存后的HDF5列名都是唯一且清晰的,后续读取时不会出现格式错误,也能明确区分原本的重复列。
临时替换处理(治标)
如果暂时不想修改读取逻辑,可以在读取HDF5列名时做后缀替换应急:
import h5py import re ch = h5py.File('/path/to/file.hdf5', 'r') c = [] for n in ch['data']['axis0']: col_name = n.decode() # 通用处理:去掉列名末尾的".数字"后缀 col_name = re.sub(r'\.\d+$', '', col_name) # 尝试转成float,失败则保留原字符串 try: c.append(float(col_name)) except ValueError: c.append(col_name)
这种方法只能临时解决当前报错,但无法解决数据列对应关系混乱的问题(比如你无法区分原本的重复列),仅适合应急场景。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

