pandas读取CSV做Normalizer处理时Protocol_6无法转float报错如何解决
报错原因
- 核心触发点来自你读取CSV时的
header=None配置:如果你的preprocessed_train.csv文件第一行本身就是列名(包含Protocol_6字段),该参数会强制pandas把表头行识别为普通数据行存入DataFrame,导致第一行全是字符串类型的列名,后续做数值归一化、类型转换时无法将字符串Protocol_6转为float,触发第一层报错。 - 第二层报错来自列名不匹配:设置
header=None后,DataFrame的列名默认为从0开始的整数序列,不存在名为Protocol_6的列,你指定该列名做astype转换时会触发列不存在的异常,因此出现嵌套报错提示。
解决方法
情况1:CSV第一行是表头(绝大多数场景)
直接去掉header=None参数,让pandas自动识别表头作为列名即可:
# 读取时保留表头 traindata = pd.read_csv('preprocessed_train.csv', low_memory=False) # 确认列名正确 print(traindata.columns.tolist()) # 后续操作保持不变即可 X = traindata.iloc[0:,1:71] Y = traindata.iloc[0:,71] scaler = Normalizer().fit(X) trainX = scaler.transform(X)
情况2:CSV确实没有表头,Protocol_6是某列的实际数据值
用pd.to_numeric做安全类型转换,无法转为数值的内容会被设为空值,后续可自行选择删除或填充:
traindata = pd.read_csv('preprocessed_train.csv', header=None, low_memory=False) # 替换n为Protocol_6所在的列索引 traindata.iloc[:, n] = pd.to_numeric(traindata.iloc[:, n], errors='coerce') # 处理空值,示例为删除含空值的行,也可替换为fillna填充0、均值等 traindata = traindata.dropna(subset=[traindata.columns[n]])
内容的提问来源于stack exchange,提问作者Yasser.AbdelSattar
相关产品推荐
相关产品推荐

