Python之replace()方法失效
阿新 • • 發佈:2021-08-09
1.背景
Titanic存活率預測案例:
# 讀取資料
df_train = pd.read_csv("./data/train.csv")
df_train.head()
OUT:
乘客姓名重複度太低,不適合直接使用。而姓名中包含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')