如何用Pandas读取CSV并填充首行A-D列空白表头
问题描述
我有一个CSV文件,首行A至D列的表头为空,E至Z列已有表头值,需要为A、B、C、D列设置指定表头标签。尝试以下代码后,出现了额外的数字列行,正确的表头被挤到第二行:
gg = pd.read_csv(r'\\path\filename.csv') gg.columns[0:4] = ["Date", "Type", "SubType1", "SubType2"]
当前打印数据如下:
Unnamed:0 Unnamed:1 Unnamed:2 Unnamed:3 Name1 Name2 Name1 Name2 Date Type Subtype Subtype2 Metric 1 metric1 metric2 metric2 9/8/2022 Vision LS-54 LS 54 .0234234 .923423 .83 9/8/2022 Vision LS-55 LS 55 .023234 .23423 .23 9/8/2022 Storm LS-54 LS 54 .0234234 .923423 .534 9/8/2022 Storm LS-55 LS 55 .023234 .23423 .343
期望实现的效果:
Date Type SubType SubType2 Name2 Name1 Name1 Name2 Date Type Subtype Subtype2 Metric 1 metric1 metric2 metric2 9/8/2022 Vision LS-54 LS 54 .0234234 .923423 .83 9/8/2022 Vision LS-55 LS 55 .023234 .23423 .23 9/8/2022 Storm LS-54 LS 54 .0234234 .923423 .534 9/8/2022 Storm LS-55 LS 55 .023234 .23423 .343
寻求正确方法,在不改动其他内容的前提下填充指定单元格。
解决方案
你遇到的问题根源是:直接修改DataFrame.columns的切片会触发pandas内部机制问题,原CSV的首行空表头被自动命名为Unnamed:*,同时你要保留的第二层表头被当成了数据行。
方法1:针对单层表头场景
如果需求是把首行作为唯一表头,仅替换前四列的空名称:
# 读取CSV时指定首行为表头 gg = pd.read_csv(r'\\path\filename.csv', header=0) # 将表头转为列表,修改前四列 new_cols = list(gg.columns) new_cols[:4] = ["Date", "Type", "SubType1", "SubType2"] # 重新赋值表头 gg.columns = new_cols
方法2:针对双层表头场景(匹配你的期望输出)
从期望效果看,CSV实际是双层表头结构(首行是主表头,第二行是子表头),此时需要读取时指定双层表头,再修改主表头的前四列:
# 读取时设置header参数为[0,1],将前两行都作为表头 gg = pd.read_csv(r'\\path\filename.csv', header=[0,1]) # 构造新的多层表头:替换前四列的主表头,保留其余部分 new_multi_cols = [ ("Date", "Date"), ("Type", "Type"), ("SubType1", "Subtype"), ("SubType2", "Subtype2") ] + list(gg.columns[4:]) # 重新赋值为MultiIndex gg.columns = pd.MultiIndex.from_tuples(new_multi_cols)
这样就能精准替换前四列的空表头,同时完整保留原有其他表头和数据内容。
内容的提问来源于stack exchange,提问作者hoodcodie
相关产品推荐
相关产品推荐

