這篇文章主要介紹了python資料清洗之字串處理的相關資料,需要的朋友可以參考下
#前言
資料清洗是一項複雜且繁瑣(kubi)的工作,同時也是整個資料分析過程中最為重要的環節。有人說一個分析專案80%的時間都在清洗數據,聽起來有些匪夷所思,但實際的工作確實如此。資料清洗的目的有兩個,第一是透過清洗讓資料可用。第二是讓資料變的更適合進行後續的分析工作。換句話說就是有」髒」資料要洗,乾淨的資料也要洗。
在資料分析中,特別是文字分析中,字元處理需要耗費極大的精力,因而了解字元處理對於資料分析而言,也是一項很重要的能力。
字串處理方法
首先我們先了解下有哪些基礎方法
首先我們了解下字串的拆分split方法
str='i like apple,i like bananer' print(str.split(','))
對字元str用逗號進行拆分的結果:
['i like apple', 'i like bananer']
print(str.split(' '))
根據空格拆分的結果:
['i', 'like', 'apple,i', 'like', 'bananer']
print(str.index(',')) print(str.find(','))
兩個查找結果都為:
12
找不到的情況下index回傳錯誤,find回傳-1
print(str.count('i'))
結果為:
4
connt用於統計目標字串的頻率
print(str.replace(',', ' ').split(' '))
結果為:
[' i', 'like', 'apple', 'i', 'like', 'bananer']
#這裡replace把逗號替換為空格後,在用空格對字串進行分割,剛好能把每個單字取出來。
除了常規的方法以外,更強大的字元處理工具費正規表示式莫屬了。
正規表示式
在使用正規表示式前我們還要先了解下,正規表示式中的諸多方法。
下面我來看下個方法的使用,首先了解下match和search方法的差異
str = "Cats are smarter than dogs" pattern=re.compile(r'(.*) are (.*?) .*') result=re.match(pattern,str) for i in range(len(result.groups())+1): print(result.group(i))
結果為:
Cats are smarter than dogs
Cats
smarter
這種形式的pettern匹配規則下,match和search方法的回傳結果是一樣的
此時若把pattern改為
pattern=re.compile(r'are (.*?) .*')
match則回傳none,search回傳結果為:
are smarter than dogs
smarter
接下來我們了解下其他方法的使用
str = "138-9592-5592 # number" pattern=re.compile(r'#.*$') number=re.sub(pattern,'',str) print(number)
結果為:
138-9592-5592
以上是透過把#號後面的內容替換為空實現提取號碼的目的。
我們也可以進一步將號碼的橫桿替換
print(re.sub(r'-*','',number))
結果為:
13895925592
#我們也可以用find的方法把找到的字串印出來
str = "138-9592-5592 # number" pattern=re.compile(r'5') print(pattern.findall(str))
結果為:
#['5', '5', '5']
正規表示式的整體內容比較多,需要我們對符合的字串的規則有足夠的了解,以下是具體的匹配規則。
向向量化字串函數
#清理待分析的散亂資料時,常常需要做一些字串規整化工作。
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) print(data)
結果為:
可以透過規則整合的一些方法對資料做初步的判斷,例如用contains 判斷每個資料中是否含有關鍵字
print(data.str.contains('@'))
結果為:
也可以對字串進行分拆,把需要的字串提取出來
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) pattern=re.compile(r'(\d*)@([a-z]+)\.([a-z]{2,4})') result=data.str.match(pattern) #这里用fillall的方法也可以result=data.str.findall(pattern) print(result)
結果為:
chen [(8622, xinlang, com)]
li [(120, qq, com)]
sun [(5243, gmail, com)]
wang [(5632, qq, com)]
zhao NaN
dtype: object
print(result.str.get(0))結果為: 或需要信箱所屬的網域名稱
print(result.str.get(1))結果為:
##當然也可以用切片的方式進行擷取,不過擷取的資料準確度不高
data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com', 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'}) print(data.str[:6])
結果為:
最後我們了解下向量化的字串方法
總結
【相關推薦】
1. Python免費影片教學
3. Python基礎入門教學
以上是python清洗字串的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!