資料清洗與準備:字串操作
1.1字串物件方法
在很多字串處理和指令碼應用中,內建的字串方法是足夠的。例如,一個逗號分隔的字串可以使用split方法拆分成多塊:
val = 'a,b, guido'
print(val.split(','))
--------------------
['a', 'b', ' guido']
split常和strip一起使用,用於清除空格(包括換行):
pieces = [x.strip() for x in val.split(',')]
print(pieces)
-------------------
['a', 'b', 'guido']
這些子字串可以使用加法與兩個冒號分隔符連線在一起:
first,second,third=pieces
print(first+'::'+second+'::'+third)
-----------
a::b::guido
但這並不是一個實用的通用方法。在字串’::'的join方法中傳入一個列表或元祖是一種更快且更加python風格化的方法:
print('::'.join(pieces))
-----------
a::b::guido
其他方法涉及定位子字串。使用python的in關鍵字是檢測子字串的最佳方法,儘管index和find也能實現同樣的功能:
print('guido' in val) #True print(val.index(',')) #1 print(val.find(':'))// #-1
find和index的區別在於index在字串沒有找到時會丟擲一個異常(而find是返回-1)。
count返回的是某個特定的子字串在字串中出現的次數:
print(val.count(',')) #2
replace將用一種模式替代另一種模式。它通常也用於傳入空字串來刪除某個模式:
print(val.replace(',', '::'))
------------
a::b:: guido
print(val.replace(',', ''))
--------
ab guido
表1-1:python內建字串方法
方法 | 描述 |
---|---|
count | 返回子字串在字串中的非重疊出現次數 |
join | 使用字串作為間隔符,用於粘合其他字串的序列 |
index | 如果在字串中找到,則返回子字串中第一個字元的位置;如果找不到則引發ValueError |
find | 返回字串中第一個出現子字元的第一個字元的位置;類似index,但如果沒有找到則返回-1 |
rfind | 返回子字串在字串中最後一次出現時第一個字元的位置;如果沒有找到,則返回-1 |
replace | 使用一個字串替代另一個字串 |
strip,rstrip,lstrip | 修剪空白,包括換行符;相當於對每個元素進行x.strip()(以及rstrip,lstrip) |
split | 使用分隔符將字串拆分為子字串的列表 |
lower | 將大寫字母轉換為小寫字母 |
upper | 將小寫字母轉換為大寫字母 |
1.2正則表示式
正則表示式提供了一種在文字中靈活查詢或匹配字串模式的方法。python內建的re模組是用於將正則表示式應用到字串上的庫。
re模組主要有三個主題:模式匹配、替代、拆分。當然,這三部分主題是相互關聯的。假設我們想將含有多種空白字元(製表符、空格、換行符)的字串拆分開。描述一個或多個空白字元的正則表示式是\s+;
import re
text="foo bar\t baz \tqux"
print(re.split('\s+',text))
----------------------------
['foo', 'bar', 'baz', 'qux']
如果想要獲得的是一個所有匹配正則表示式的模式的列表,我們可以使用findall方法:
regex = re.compile('\s+')
print(regex.findall(text))
------------------------
[' ', '\t ', ' \t']
如果我們需要將相同的表示式應用到多個字串上,推薦使用re.complie建立一個正則表示式物件,這樣做有利於節約CPU週期。
match和search與findall相關性很大。findall返回的是字串中所有的匹配項,而search返回的僅僅是第一個匹配項。match更為嚴格,它只在字串的起始位置進行匹配。
表1-2:正則表示式方法
方法 | 描述 |
---|---|
findall | 將字串中所有的非重疊匹配模式以列表形式返回 |
match | 在字串起始位置匹配模式,也可以將模式組建匹配到分組中,如果模式匹配上了,返回的一個匹配物件,否則返回None |
search | 掃描字串的匹配模式,如果掃描到了返回匹配物件,與match方法不同的是,search方法的匹配可以是字串的任意位置,而不僅僅是字串的起始位置 |
split | 根據模式,將字串拆分為多個部分 |
sub,subn | 用替換表示式替換字串中所有的匹配(sub)或第n個出現的匹配串(subn),使用符號\1、\2…來引用替換字串中的匹配組元素 |
1.3pandas中的向量化字串函式
清理雜亂的資料集用於分析通常需要大量的字串處理和正則化。包含字串的列有會含有缺失資料,使事情變得複雜:
data={'Dave':'[email protected]','Steve':'[email protected]',
'Rob':'[email protected]','Wes':np.nan}
data=pd.Series(data)
print(data)
------------------------
Dave [email protected]
Steve [email protected]
Rob [email protected]
Wes NaN
dtype: object
print(data.isnull())
--------------
Dave False
Steve False
Rob False
Wes True
dtype: bool
print(data.str.contains('gmail'))
--------------
Dave False
Steve True
Rob True
Wes NaN
dtype: object
我們可以使用字串切片的類似語法進行向量化切片:
print(data.str[:5])
--------------
Dave [email protected]
Steve steve
Rob [email protected]
Wes NaN
dtype: object