Python內建了字串物件,並且具有一系列內建的強大方法,這讓Python處理字串變得非常容易,在此基礎上建立的Pandas同樣提供了一系列向量化字串操作(vectorized string operation)
這些都是處理(清洗)現實工作中的數據時不可或缺的功能.在這一節中,我們將介紹Pandas的字串操作
前面的章節講解瞭如何運用Numpy和Pandas來對數位陣列進行操作
Numpy對數位陣列具有強大的運算能力的原因之一,就是因爲Numpy能夠在陣列運算的時候實現廣播操作
但是Numpy並沒有對字串實現向量化,這就意味使用Numpy來處理字串陣列依舊是使用Python的原生陣列操作,所以速度會比較慢
要實現對字元陣列中的每一個字串進行操作,就只能進行遍歷操作,而且Python原生的遍歷操作無法實現對缺失值的處理
string_1=['A','B','C','D','E']
string_2=['A','B',None,'D','E']
print([s.lower() for s in string_1])
print([s.lower() for s in string_2])
>>>
['a', 'b', 'c', 'd', 'e']
Traceback (most recent call last):
File "food.py", line 14, in <module>
print([s.lower() for s in string_2])
File "food.py", line 14, in <listcomp>
print([s.lower() for s in string_2])
AttributeError: 'NoneType' object has no attribute 'lower'
爲此,Pandas爲可能存在字串的Series和Index物件提供了str屬性
Pandas的Series和Index物件具有的str屬性不經能夠實現向量化操作,而且能夠正確的處理缺失值
例如
Series_1=pd.Series(['A','B','C','D','E'])
Series_2=pd.Series(['A','B',None,'D','E'])
print(Series_1.str.lower())
print(Series_2.str.lower())
>>>
0 a
1 b
2 c
3 d
4 e
dtype: object
0 a
1 b
2 None
3 d
4 e
dtype: object
Pandas的字串屬性的方法幾乎複製了所有Python的內建字串方法,下面 下麪將列舉一些常見的
並且這些方法的返回值可能不同,例如上面的lower()方法將會返回一個Series物件,而len方法將會返回一個整數
方法 | 方法 | 方法 | |
---|---|---|---|
len() | lower() | translate() | islower() |
ljust() | upper() | startswith() | isupper() |
rjust() | find() | endwith() | isnumeric() |
center() | rfind() | isalnum() | isdecimal() |
zfill() | index() | isalpha() | split() |
strip() | reindex() | isdigital() | rsplit() |
rstrip() | capitalize() | isspace() | partition() |
lstrip() | swapcase() | istitle() | rpartition() |
Pandas的字串方法根據Python標準庫的re模組實現了正則表達式.下面 下麪將介紹Pandas的str屬性內建的正則表達式相關方法
方法 | 說明 |
---|---|
match() | 對每個元素呼叫re.match(),將會返回一個布爾陣列 |
extract() | 對每個元素呼叫re.match(),將會返回所有結果構成的字串陣列 |
findall() | 對每個元素嗲用re.findall() |
replace() | 用正則模式替換字串 |
contains() | 對每個元素呼叫re.search()返回布爾型別 |
count() | 計算符合正則表達式的字串數量 |
split() | 等價於str.spilt(),支援正則表達式 |
rsplit() | 等價於str.split()支援正則表達式 |
例如
Series_1=pd.Series(['A','B','C','D','E'])
Series_2=pd.Series(['A','B',np.nan,'D','E'])
print(Series_1.str.lower())
print(Series_2.str.lower())
print(Series_2.str.findall('[Aa]'))
>>>
0 a
1 b
2 c
3 d
4 e
dtype: object
0 a
1 b
2 NaN
3 d
4 e
dtype: object
0 [A]
1 []
2 NaN
3 []
4 []
dtype: object
除了上面介紹的Pandas字串的正常操作和正則表達式外,Pandas的str屬性還提供了其他的一些方法
這些方法非常的有用
其他字串方法 | 說明 |
---|---|
get() | 獲取元素索引位置上的值,索引從0開始 |
slice() | 對元素進行切片取值 |
slice_replace() | 對元素進行切片替換 |
cat() | 連線字串 |
repeat() | 重複元素 |
normalize() | 將字串轉換爲Unicode規範形式 |
pad() | 在字串的左邊右邊或者兩邊增加空格 |
wrap() | 將字串按照指定的寬度換行 |
join() | 用分隔符連線Series物件的每個元素 |
get_dummies() | 按照分隔符提取每個元素的dummy變數,轉換爲one-hot編碼的DataFrame |