ValueError:无法将字符串转换为浮点数:'n'

Posted

技术标签:

【中文标题】ValueError:无法将字符串转换为浮点数:\'n\'【英文标题】:ValueError: could not convert string to float: 'n'ValueError:无法将字符串转换为浮点数:'n' 【发布时间】:2019-02-25 07:37:36 【问题描述】:

您好,我正在关注有关 Udemy 的视频。我们正在尝试应用随机森林分类器。在我们这样做之前,我们将数据框中的一列转换为字符串。 “Cabin”列表示诸如“4C”之类的值,但为了减少唯一值的数量,我们只想使用第一个数字映射到新列“Cabin_mapped”。

data['Cabin_mapped'] = data['Cabin'].astype(str).str[0]
# this transforms the letters into numbers
cabin_dict = k:i for i, k in enumerate(
    data['Cabin_mapped'].unique(),0)

data.loc[:,'Cabin_mapped'] =  data.loc[:,'Cabin_mapped'].map(cabin_dict)

data[['Cabin_mapped', 'Cabin']].head() 

下面这部分只是简单地将数据分成训练集和测试集。参数对于找出问题并不重要。

X_train_less_cat, X_test_less_cat, y_train, y_test = \
    train_test_split(data[use_cols].fillna(0), data.Survived, 
                     test_size = 0.3, random_state=0) 

拟合后出现错误,说我无法将字符串转换为浮点数。 rf = RandomForestClassifier(n_estimators=200, random_state=39) rf.fit(X_train_less_cat, y_train)

看来我需要将其中一个输入转换回浮点数才能使用随机森林算法。尽管错误没有出现在教程视频中。如果有人可以帮助我,那就太好了。

【问题讨论】:

欢迎来到 ***。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 Minimal, complete, verifiable example 适用于此。在您发布 MCVE 代码并准确描述问题之前,我们无法有效地帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现您描述的问题。 “拟合后出现错误,说我无法将浮点数转换为字符串”-但标题中的错误是另一种方式,字符串到浮点数,我'我猜那是因为你的表中有NaNs,因此是'n'。哪儿来的呢?他们应该在那里吗? Rup,对不起,我的意思是写“将字符串转换为浮点数”。所以'n'键对应于NaN值并映射到Cabin_mapped中的0。我仍然想知道为什么'n'会导致与其他大写字母不同的问题。我尝试通过 data['Cabin'].fillna() 解决这个问题,但我无法使用 fillna(0),因为我需要一封信吗? Rup,我做了 data['Cabin'] = data['Cabin'].fillna('X0")。但是,除了这次用“X0”而不是 n 之外,同样的问题仍然存在. 我也刚刚尝试了 fillna(0),它给了我一个奇怪的错误,表明“E49”无法转换,这很奇怪,因为 E49 只是一个没有缺失值的随机小屋。 【参考方案1】:

这是一个完整的示例 - 我已经突出显示了您缺少的部分。您需要将每一列都转换为数字,而不仅仅是“小屋”。

!wget https://raw.githubusercontent.com/agconti/kaggle-titanic/master/data/train.csv

import pandas as pd

data = pd.read_csv("train.csv")




data['Cabin_mapped'] = data['Cabin'].astype(str).str[0]
# this transforms the letters into numbers
cabin_dict = k:i for i, k in enumerate(
    data['Cabin_mapped'].unique(),0)

data.loc[:,'Cabin_mapped'] =  data.loc[:,'Cabin_mapped'].map(cabin_dict)

data[['Cabin_mapped', 'Cabin']].head()


from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import train_test_split


## YOU ARE MISSING THIS BIT, some of your columns are still strings
## they need to be converted to numbers (ints OR floats)
for n,v in data.items():
    if v.dtype == "object":
        data[n] = v.factorize()[0]
## END of the bit you're missing

use_cols = data.drop("Survived",axis=1).columns

X_train_less_cat, X_test_less_cat, y_train, y_test = \
    train_test_split(data[use_cols].fillna(0), data.Survived, 
                    test_size = 0.3, random_state=0) 


rf = RandomForestClassifier(n_estimators=200, random_state=39)
rf.fit(X_train_less_cat, y_train)

【讨论】:

哇,感谢您的广泛回答!你间接帮我解决了这个问题。所以在本教程中,讲师使用了 data[use_cols],它等于三列数据(Cabin、Cabin mapped、Sex)。我不知道她为什么要使用它,因为它不必要地包含没有转换为数字的“小屋”。对她来说,它奏效了。我只是把“小屋”拿出来。谢谢!

以上是关于ValueError:无法将字符串转换为浮点数:'n'的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:无法将字符串转换为浮点数:'2100 - 2850'

ValueError:无法将字符串转换为浮点数:'Mme'

ValueError:无法将字符串转换为浮点数:'62,6'

ValueError:无法将字符串转换为浮点数:''20,99''

我收到 ValueError:无法将字符串转换为浮点数:'8,900' [重复]

ValueError:无法将字符串转换为浮点数:'31,950'