使用np.loadtxt读取CSV文件时出现ValueError:无法将字符串'A1'转换为浮点数的解决方案咨询
解决CSV加载报错:ValueError: could not convert string to float: 'A1'
嘿,你的问题其实出在两个地方,咱们一步步拆解:
错误原因
- 表头处理问题:你的
A1-dm.csv第一行是字符串表头(A1,A2,A3,Class),但np.loadtxt()默认会把所有行都当作数值数据来解析,遇到'A1'这种字符串自然转不成float,直接抛出错误。 - 数据访问方式错误:就算你跳过表头,
np.loadtxt()返回的是普通二维numpy数组,根本不支持dataset['A1']这种按列名访问的方式——这种用法是给结构化数组或者Pandas DataFrame准备的。
解决方案
下面给你两种可行的解决办法,推荐第二种,因为处理带表头的CSV用Pandas更省心:
方法1:用numpy的genfromtxt处理表头和结构化数据
genfromtxt比loadtxt更灵活,能自动识别表头和列类型:
import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from MDLP import MDLP_Discretizer def main(): # 读取CSV,第一行作为字段名,自动推断列类型 dataset = np.genfromtxt('A1-dm.csv', delimiter=',', names=True, dtype=None) # 提取特征列,合并成二维数组X X = np.column_stack([dataset['A1'], dataset['A2'], dataset['A3']]) # 提取标签列y y = dataset['Class'] # 后续代码正常执行 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33) discretizer = MDLP_Discretizer(features=np.arange(X.shape[1])) discretizer.fit(X_train, y_train) X_train_discretized = discretizer.transform(X_train) X_test_discretized = discretizer.transform(X_test) # 打印测试内容 print('Original dataset:\n%s' % str(X_train[0:5])) print('Discretized dataset:\n%s' % str(X_train_discretized[0:5])) if __name__ == '__main__': main()
方法2:用Pandas读取(更简洁推荐)
Pandas是处理CSV这类表格数据的神器,代码更直观:
import pandas as pd import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split from MDLP import MDLP_Discretizer def main(): # 直接读取带表头的CSV,返回DataFrame df = pd.read_csv('A1-dm.csv') # 提取特征列并转成numpy数组 X = df[['A1', 'A2', 'A3']].to_numpy() # 提取标签列并转成numpy数组 y = df['Class'].to_numpy() # 后续代码和上面一致 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33) discretizer = MDLP_Discretizer(features=np.arange(X.shape[1])) discretizer.fit(X_train, y_train) X_train_discretized = discretizer.transform(X_train) X_test_discretized = discretizer.transform(X_test) print('Original dataset:\n%s' % str(X_train[0:5])) print('Discretized dataset:\n%s' % str(X_train_discretized[0:5])) if __name__ == '__main__': main()
额外提醒
- 别忘了在代码开头导入对应的库(比如numpy或者pandas),你原来的代码里没导入numpy,这也是潜在问题。
- 如果你的CSV里有缺失值,Pandas也能更方便地处理,这是
genfromtxt比不了的。
内容的提问来源于stack exchange,提问作者Evan Gertis
相关产品推荐
相关产品推荐

