python清洗字串的實例詳解

Y2J
發布: 2017-05-10 12:00:30
原創
2341 人瀏覽過

這篇文章主要介紹了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免費影片教學

2. Python物件導向影片教學

3. Python基礎入門教學

以上是python清洗字串的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板