2017-10-04 78 views
1

嗨,我试图让一个名为“TitleGroup”这将有人群这将组与一些无法在Python中替换替换命令值

traindf['Title'] = traindf['Name'].apply(lambda x: str(x).split(',')[1].split('.')[0]) 
traindf['TitleGroup'] = 0 
traindf['TitleGroup'] = traindf['Title'].replace(['Mrs','Miss','Mme','Ms','Lady','Mlle','the Countess','Dona'], 'female', regex = True) 
traindf['TitleGroup'] = traindf['Title'].replace(['Sir','Don','Rev','Mr',],'male', regex = True) 
#traindf['TitleGroup'] = traindf['Title'].replace(['Col','Dr','Col','Capt','Major','Jonkheer','Master'],'Special', regex = True) 
#traindf['TitleGroup'] = traindf['Title'].map({'male':1, 'female':0, 'Special':2}) 
traindf.head() 

enter image description here

类似的标题栏

1.程序正在输出很少的标题,但看第二行'Mrs'正在输出为'男性'? “夫人”的标题应该替换为“女性”,但不会。

2.注销第5行时,它显示与Title相同名称的TitleGroup。

3.将正则表达式作为False输出与第二点相同的结果。

4.Uncommenting在TitleGroup是所有NaN

即使使用的.loc 6号线的结果说,我不能帮你

回答

0

由于蟒蛇文档中mentionned为replace method,该方法将:

返回字符串s的副本,其中所有出现的子字符串旧 被新的替换。

所以,当你第一次更换(traindf['Title'].replace(['Mrs','Miss','Mme','Ms','Lady','Mlle','the Countess','Dona'], 'female', regex = True))你不改变traindf['Title']的内容,但你把导致您traindf['TitleGroup']领域。因此,在traindf['Title']中的每个女士,小姐......都还在那里。

然后,当你第二替换:traindf['Title'].replace(['Sir','Don','Rev','Mr',],'male', regex=True),仍有一些“太太”在traindf['Title'],并在“夫人”,有“先生”^_ ^,所以replace方法会发现一些“先生男性'与替换‘’,你的‘夫人’将成为‘男性’

如果你想避免这样的问题,你可以链替换这样的电话:

traindf['TitleGroup'] = traindf['Title'].replace(
    ['Mrs','Miss','Mme','Ms','Lady','Mlle','the Countess','Dona'], 
    'female', 
    regex=True 
).replace(['Sir','Don','Rev','Mr',],'male', regex = True) 

这样,结果字符串将在traindf['TitleGroup']中存储一次,并且所有替换都将完成。

+1

它的工作!但映射又把我扔了NaNs?我知道我可以直接使用数字而不是男性,女性和特殊号码。但从我的理解地图功能应该已经工作。对? – Pseudo

+0

@Pseudo我不确定你想用数字来实现什么,如果你需要计算每种类型的出现次数,使用['collections.Counter'](https://docs.python.org/ 3.6/library/collections.html#counter-objects)对象 –

+0

我试图将它们转换为数字,以便我可以在我的机器学习模型中使用它。 – Pseudo