Pandas如何禁止自动将空白表头重命名为Unnamed开头名称
问题说明
现有处理逻辑为分别读取预存的多层表头文件、原始数据文件,将表头匹配到数据数组后导出为制表符分隔的CSV文件,初始实现代码如下:
loader = pd.read_csv('Resources/Headers.txt', sep='\t', header=[0, 1, 2]) ndf = pd.DataFrame(data=data, columns=loader.columns.get_level_values(2) ndf.columns = loader.columns ndf.to_csv('Resources/output.txt', sep='\t', index=False, header=True)
运行时存在问题:表头中预设的空白值会被pandas自动重命名为Unnamed: 8_level_0这类格式,无法保留原本的空白列名。
解决方法
pandas读取文本类文件时,会自动为检测到的空表头填充Unnamed:开头的默认名称,该逻辑无直接关闭参数,只需在读入表头后批量匹配自动生成的列名,将其还原为空字符串即可,同时修正原代码第二行缺失右括号的语法问题,修正后完整代码如下:
# 读取多层表头文件 loader = pd.read_csv('Resources/Headers.txt', sep='\t', header=[0, 1, 2]) # 批量还原自动填充的空白表头 processed_cols = [] for col in loader.columns: # 遍历多层列索引的每一层,匹配Unnamed开头的自动生成值并替换为空 col_levels = tuple( "" if isinstance(val, str) and val.startswith("Unnamed:") else val for val in col ) processed_cols.append(col_levels) loader.columns = pd.MultiIndex.from_tuples(processed_cols) # 组装目标DataFrame ndf = pd.DataFrame(data=data, columns=loader.columns.get_level_values(2)) ndf.columns = loader.columns # 导出文件,空白表头会正常保留 ndf.to_csv('Resources/output.txt', sep='\t', index=False, header=True)
逻辑说明
- 自动生成的Unnamed类列名有固定前缀,替换时只会命中pandas自动填充的空白表头,不会修改原本有业务含义的正常列名
- 针对多层表头的每一个层级单独做匹配替换,不会出现某一层空白值漏处理的问题
- 导出时pandas会将空字符串列名写为空白单元格,和预设的空白表头效果完全一致
内容的提问来源于stack exchange,提问作者Cai Allin
相关产品推荐
相关产品推荐

