Pandas: 使用str.replace() 進行文本清洗

str.replace()能夠一次處理一整個Series。str.replace()的正式形式爲 Series.str.replace(pat, repl) ,其中pat爲想要尋找的模式,通常爲正則表達式,repl爲要替換進去的字符串或函數。html

下面是幾個簡單的例子,X表明一個Series,repl皆爲字符串:正則表達式

X.str.replace(r"iphone\s+7", "iphone7")  #爲了將iphone7視爲一個詞,把iphone 7轉換爲iphone7,去除空格。
X.str.replace(r"16gbiphone", "16gb iphone")  #將16gbiphone轉換無16gb iphone,增長空格。
X.str.replace(r"fl\s?\.?\s?oz", "floz")  #將fl.oz或fl . oz轉換爲floz

若是是一些比較複雜的狀況,則須要將repl自定義爲函數:iphone

1) 將1.101000變爲1.101,即將後面的"0"去掉。函數

remove0 = lambda m:m.group(0).rstrip("0") X.str.replace(r"\d\.\d*[1-9]+0+", remove0)

    本例中將repl定義爲一個匿名函數,m.group(0)爲匹配到的全部字符串,注意其不會匹配到1.000的狀況,由於pat中存在[1-9]。url

2) 將1.000kg變爲1kg,這裏由於要去除的.0兩個字符位於中間,因此沒法用上面的rstrip()spa

table1 = str.maketrans("","","0.") remove1 = lambda m:m.group(0).translate(table1) X.str.replace(r"\.0+[a-z]+", remove1)

    例中使用str.maketrans()方法指定想要刪除的字符,再用translate()刪除.net

3) 將0.0300kg轉換爲0.03kg。這裏因爲0.03自己存在0,因此不能用str.maketrans()了,由於會將全部0都刪除。因此這裏用兩個正則表達式分別找到0.03和kg,再拼接起來:code

def remove2(data): al1 = re.findall(r"\d+\.\d*[1-9]+0+",data.group(0)) al2 = re.findall(r"[a-z]+",data.group(0)) return al1[0].rstrip("0") + al2[0] X.str.replace(r"\d+\.\d*[1-9]+0+[a-z]+", remove2)

4) 商品中有不少衣服鞋子之類的,通常都標有尺碼,好比3",15」等。這裏要把後面的尺碼符號‘ 」 ’提取出來並用「colon」表示,讓模型識別出前面的數字3和15是表明尺碼大小。htm

def findcolon(data): al1 = re.findall(r'\d{1,2}\.\d{1,3}|\d{1,2}|1\d{2}', data.group(0)) return al1[0]+" colon " X.str.replace(r'(?:\d{1,2}\.\d{1,3}|\d{1,2}|1\d{2})(?:\s?\")', findcolon) # 匹配2.3「, 55", 132"等,轉換爲2.3 colon
相關文章
相關標籤/搜索