处理Python CSV数据时出现‘无法将字符串转换为浮点数’错误
问题描述
我尝试对CSV格式的泰坦尼克数据集实现逻辑回归,但完全参照网上示例操作后,仍出现数据未转换为可数值运算格式的错误。我日常使用C++/Java,对Python语法及数据集处理函数较为陌生,附上代码及错误信息:
错误信息
ValueError: could not convert string to float: ''
原代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report def calc_age(cols): Age = cols[0] Pclass = cols[1] if pd.isnull(Age): if Pclass == 1: return 37 elif Pclass == 2: return 29 else: return 24 else: return Age def driverMain(): train = pd.read_csv('/Users/krishanbansal/Downloads/LogisticRegression-master/titanic_train.csv') test = pd.read_csv('/Users/krishanbansal/Downloads/LogisticRegression-master/titanic_test.csv') sns.heatmap(test.isnull(),yticklabels=False,cbar=False,cmap='viridis') train['Age'] = train[['Age','Pclass']].apply(calc_age,axis=1) test['Age'] = test[['Age','Pclass']].apply(calc_age,axis=1) sex = pd.get_dummies(train['Sex'],drop_first=True) embark = pd.get_dummies(train['Embarked'],drop_first=True) train.drop(['Sex','Embarked','Name','Ticket'],axis=1,inplace=True) train = pd.concat([train,sex,embark],axis=1) train.head() train.drop(['male','Q','S'],axis=1,inplace=True) sns.heatmap(train.isnull(),yticklabels=False,cbar=False,cmap='viridis') X_train, X_test, y_train, y_test = train_test_split(train.drop('Survived',axis=1),train['Survived'], test_size=0.20,random_state=101) logmodel = LogisticRegression() logmodel.fit(X_train,y_train) predictions = logmodel.predict(X_test) print(classification_report(y_test,predictions)) print("Accuracy:",metrics.accuracy_score(y_test, predictions)) if __name__ == '__main__': driverMain()
问题分析与修复方案
核心错误点
- 错误删除数值化分类特征:用
pd.get_dummies把Sex、Embarked转换成了数值列(male、Q、S),但随后又删掉了这些列,导致模型缺少关键分类特征;同时剩余的Cabin列是字符串类型且存在大量空值,无法参与数值运算。 - 未处理
Cabin列:该列包含字符串值和空值,逻辑回归模型仅支持数值型数据,必须处理。 - 缺少
metrics模块对应导入:代码中使用了metrics.accuracy_score但未导入对应的评估函数。
修正后的代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, accuracy_score # 补充导入accuracy_score def calc_age(cols): Age = cols[0] Pclass = cols[1] if pd.isnull(Age): if Pclass == 1: return 37 elif Pclass == 2: return 29 else: return 24 else: return Age def driverMain(): train = pd.read_csv('/Users/krishanbansal/Downloads/LogisticRegression-master/titanic_train.csv') test = pd.read_csv('/Users/krishanbansal/Downloads/LogisticRegression-master/titanic_test.csv') # 处理Age列空值 train['Age'] = train[['Age','Pclass']].apply(calc_age,axis=1) test['Age'] = test[['Age','Pclass']].apply(calc_age,axis=1) # 分类特征数值化 sex = pd.get_dummies(train['Sex'],drop_first=True) embark = pd.get_dummies(train['Embarked'],drop_first=True) # 删除不需要的列:保留数值化后的列,同时删除Cabin列(或可转换为二值特征) train.drop(['Sex','Embarked','Name','Ticket','Cabin'],axis=1,inplace=True) train = pd.concat([train,sex,embark],axis=1) # 拆分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(train.drop('Survived',axis=1),train['Survived'], test_size=0.20,random_state=101) # 训练模型(添加max_iter避免收敛警告) logmodel = LogisticRegression(max_iter=200) logmodel.fit(X_train,y_train) predictions = logmodel.predict(X_test) # 输出评估结果 print(classification_report(y_test,predictions)) print("Accuracy:",accuracy_score(y_test, predictions)) if __name__ == '__main__': driverMain()
关键修改说明
- 保留了
pd.get_dummies生成的数值化列(male、Q、S),这些是模型需要的数值型分类特征。 - 删除了
Cabin列:如果想保留该列信息,也可以将其转换为“是否有船舱”的二值特征(train['Cabin'] = train['Cabin'].notnull().astype(int))。 - 补充导入了
accuracy_score,无需再通过metrics.调用。 - 给
LogisticRegression添加了max_iter=200,避免因默认迭代次数不足导致的收敛警告。
内容的提问来源于stack exchange,提问作者JG98
相关产品推荐
相关产品推荐

