12.Pandas向量化字串操作

2020-08-08 13:26:22

Pandas向量化字串操作

Python內建了字串物件,並且具有一系列內建的強大方法,這讓Python處理字串變得非常容易,在此基礎上建立的Pandas同樣提供了一系列向量化字串操作(vectorized string operation)

這些都是處理(清洗)現實工作中的數據時不可或缺的功能.在這一節中,我們將介紹Pandas的字串操作


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字串屬性方法列表

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字串的正則表達式

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字串的正常操作和正則表達式外,Pandas的str屬性還提供了其他的一些方法

這些方法非常的有用

其他字串方法 說明
get() 獲取元素索引位置上的值,索引從0開始
slice() 對元素進行切片取值
slice_replace() 對元素進行切片替換
cat() 連線字串
repeat() 重複元素
normalize() 將字串轉換爲Unicode規範形式
pad() 在字串的左邊右邊或者兩邊增加空格
wrap() 將字串按照指定的寬度換行
join() 用分隔符連線Series物件的每個元素
get_dummies() 按照分隔符提取每個元素的dummy變數,轉換爲one-hot編碼的DataFrame