You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理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()
问题分析与修复方案

核心错误点

  1. 错误删除数值化分类特征:用pd.get_dummies把Sex、Embarked转换成了数值列(male、Q、S),但随后又删掉了这些列,导致模型缺少关键分类特征;同时剩余的Cabin列是字符串类型且存在大量空值,无法参与数值运算。
  2. 未处理Cabin列:该列包含字符串值和空值,逻辑回归模型仅支持数值型数据,必须处理。
  3. 缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:45:59