前言
資料清洗是一項複雜且繁瑣(kubi)的工作,同時也是整個資料分析過程中最為重要的環節。有人說一個分析專案80%的時間都在清洗數據,聽起來有些匪夷所思,但實際的工作確實如此。資料清洗的目的有兩個,第一是透過清洗讓資料可用。第二是讓資料變的更適合進行後續的分析工作。換句話說就是有」髒」資料要洗,乾淨的資料也要洗。
在資料分析中,特別是文字分析中,字元處理需要耗費極大的精力,因而了解字元處理對於資料分析而言,也是一項很重要的能力。
字串處理方法
首先我們先了解下都有哪些基礎方法
首先我們了解下字串的分割split方法
rrrereee分的結果:['i like apple', 'i like bananer']
str='i like apple,i like bananer' print(str.split(','))根據空格分割的結果:
['i' ', 'like', 'bananer']
print(str.split(' '))兩個查找結果都為:
12
rr
4
connt用於統計目標字串的頻率print(str.index(',')) print(str.find(','))
這裡replace把逗號替換為空格後,在用空格對字符串進行分割,剛好能把每個單字取出來。
除了常規的方法以外,更強大的字元處理工具費正規表示式莫屬了。print(str.count('i'))結果
ya種形式的pettern符合規則下,match和search方法的回傳結果是相同的
此時如果把pattern改為
print(str.replace(',', ' ').split(' '))
match則回傳none,search回傳結果為:
match則回傳none,search回傳結果為:
match則回傳none smarter than dogs
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))結果為:
我們還可以進一步對號碼的橫桿進行替換
pattern=re.compile(r'are (.*?) .*')
結果為:
13895925592
13895925592
結果為:
['5', '5', '5']
正則表達式的整體內容比較多,需要我們對匹配的字符串的規則有足夠的了解,下面是具體的匹配規則。
str = "138-9592-5592 # number" pattern=re.compile(r'#.*$') number=re.sub(pattern,'',str) print(number)結果為:
也可以將字串進行分拆,把需要的字串提取出來
print(re.sub(r'-*','',number))
结果为:
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])
结果为:
最后我们了解下矢量化的字符串方法
更多python資料清洗系列之字串處理詳解相关文章请关注PHP中文网!