您好我正在尝试创建一个名为“TitleGroup”的专栏,该专栏将有一组人员,这些专家将使用数字对相似的标题进行分组
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()
1.该程序正在输出几个标题,但看第二行'太太'输出为'男性'? “太太”的标题应该用“女性”代替,但事实并非如此。
2.取消注释第5行,显示TitleGroup,其名称与Title相同。
3.将正则表达式设为False,输出与第二点相同的结果。
4.取消注释第6行导致TitleGroup全部为NaN
即使使用.loc说我也帮不了你
答案 0 :(得分:0)
正如replace method的python文档中所提到的,该方法将:
返回字符串s的副本,其中出现所有子字符串old 取而代之的是新的。
因此,当您进行第一次替换(View
)时,您不会更改traindf['Title'].replace(['Mrs','Miss','Mme','Ms','Lady','Mlle','the Countess','Dona'], 'female', regex = True)
的内容,但会将结果放在traindf['Title']
字段中。所以traindf['TitleGroup']
中的每一位太太,小姐......仍然在那里。
然后,当您进行第二次替换时:traindf['Title']
,仍有一些' Mrs'在traindf['Title'].replace(['Sir','Don','Rev','Mr',],'male', regex=True)
和' Mrs'中,有' Mr' ^ _ ^,因此traindf['Title']
方法会找到一些' Mr'替换为男性'以及您的' Mrs'将成为男性
如果您想避免此类问题,可以将替换调用链接起来:
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)
中存储一次,所有替换都将完成。