1. 程式人生 > >資料清洗與準備:字串操作

資料清洗與準備:字串操作

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