Python之replace()方法失效


1.背景

Titanic存活率預測案例:

# 讀取數據
df_train = pd.read_csv("./data/train.csv")
df_train.head()

OUT:

image

乘客姓名重復度太低,不適合直接使用。而姓名中包含Mr. Mrs. Dr.等具有文化特征的信息,可將之抽取出來:

# 定義一個抽取方法
def GetMiddleStr(content):
    startStr = ','
    endStr = '.'
    startIndex = content.index(startStr)
    if startIndex>=0:
        startIndex += len(startStr)
    endIndex = content.index(endStr)
    content = content[startIndex:endIndex]
    return content

df_train["Name"] = df_train["Name"].apply(GetMiddleStr)
df_train['Name'].unique()

OUT:

array([' Mr', ' Mrs', ' Miss', ' Master', ' Don', ' Rev', ' Dr', ' Mme',
       ' Ms', ' Major', ' Lady', ' Sir', ' Mlle', ' Col', ' Capt',
       ' the Countess', ' Jonkheer'], dtype=object)

通過replace()方法將上面得到的頭銜縮小類別。

2.BUG復現

df_train["Name"] = df_train["Name"].replace(['Lady','the Countess','Capt','Col',\
                                                'Don','Dr','Major','Rev','Sir',\
                                                'Jonkheer','Dona'],'Rare')
df_train["Name"] = df_train["Name"].replace('Mlle','Miss')
df_train["Name"] = df_train["Name"].replace('Ms','Miss')
df_train["Name"] = df_train["Name"].replace('Mme','Mrs')

df_train['Name'].unique()

OUT:

array([' Mr', ' Mrs', ' Miss', ' Master', ' Don', ' Rev', ' Dr', ' Mme',
       ' Ms', ' Major', ' Lady', ' Sir', ' Mlle', ' Col', ' Capt',
       ' the Countess', ' Jonkheer'], dtype=object)

3.原因

在Python中字符串是immutable對象,是不可變對象。所以string使用replace需要重新賦值,生成一個新的對象。(即replace函數返回一個新值,不改變原來str的值,所以輸出的仍為原結果)

4.解決

不能直接調用replace(),需要轉為字符串,才可以對元素的部分內容進行修改

df_train["Name"] = df_train["Name"].str.replace('Mlle','Miss')

但是此方法代碼中傳入replace“被替換的值”不支持傳入列表,僅支持傳入單個字符串

如,以下代碼將會報錯:

df_train["Name"] = df_train["Name"].str.replace(['Lady','the Countess','Capt','Col',\
                                                'Don','Dr','Major','Rev','Sir',\
                                                'Jonkheer','Dona'],'Rare')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM