Python易混淆知識系列:Pandas字符串方法和字符串內建函數,使用Python的一個優勢就是字符串處理起來比較容易。
Python的初學者在學習字符串內建函數的時候往往會很困惑:字符串的內建函數是對單個字符串對象處理,如果要對成千上萬個字符串對象處理該怎麼辦?
不少已經使用Python工作很長時間的同學,即使已經學會使用Pandas對象的.apply()方法來處理字符串,依然會時常忘記:其實Pandas已經自帶功能強大的向量化字符串操作。
即使知道Pandas字符串方法的同學,使用的時候也經常與字符串內建函數混淆。
而熟練使用Pandas字符串方法的同學往往會覺得,其方法的代碼簡潔性與運行效率都遠高於其他的寫法。真相到底如何?Pandas字符串方法和字符串內建函數有什麼不同?運算效率真的像傳聞那麼高嗎?
今天我們就好好捋一下這塊Python易混淆的知識點。
1. 快速入門向量化字符串操作
初學Python字符串內建函數的同學肯定知道有個叫.lower()的方法可以將字符串中的大寫英文字母轉化為小寫,比如將字符串對象』ABCD』轉化為小寫:
點擊添加圖片描述(最多60個字)
編輯
如果字符型的Series對象中的字符串要轉化為小寫呢?比如:
點擊添加圖片描述(最多60個字)
編輯
此時,我們就可以使用Series的str方法中的.lower()來處理:
點擊添加圖片描述(最多60個字)
編輯
同理,如果要將Series對象中的所有的大寫字母變成小寫,可以使用.str.upper()。
看到這裡,相信很多沒有使用過Pandas字符串方法的同學會驚奇地發現,這跟字符串對象的內建函數差不多呀?只不過多了一個通過.str()方法調用函數的過程。
確實,大多數Pandas的字符串方法借鑑了Python字符串內建函數的內容,這裡給大家梳理一下,兩種處理字符串方法基本相同的地方:
· 求字符串長度
§ .str.len()
· 字符檢索
§ .str.find()和.str.rfind()
§ .str.index()和.str.rindex()
· 字符轉換
§ .str.lower()和.str.upper()
§ .str.title()和.str.capitalize()
§ .str.swapcase()
· 字符類型判斷
§ .str.islower()和.str.isupper()
§ .str.isnumeric()、.str.isalnum()、.str.isdecimal()、.str.isalpha()、.str.isdigit()
§ .str.isspace()
§ .str.istitle()
· 字符對齊與填充
§ .str.startswith()和.str.endswith()
§ .str.center()
§ .str.ljust()和.str.rjust()
· 字符分隔
§ .str.split()和.str.rsplit()
§ .str.partition()和.str.rpartition()
· 字符整理
§ .str.strip()、.str.rstrip()、.str.lstrip()
以上方法都是Pandas字符串方法與Python字符串內建函數中基本一致的部分,無論是方法名還是調用過程,只有少部分有少許區別。
2. 其他字符串方法
除了與字符串內建函數類似的方法以外,Pandas還有一些功能強大的字符串方法。
(1) 向量化字符串的取值和切片操作
很多同學會很疑惑,字符串對象可以進行取值和切片操作,但是Pandas對象中的字符串如何進行相同的操作?比如以上面的Series對象為例:
點擊添加圖片描述(最多60個字)
編輯
如果想把上面Series對象中所有字符串中的前三個字母取出來,可以通過調用.str屬性後,返回的對象直接使用和字符串切片一樣的方法:
點擊添加圖片描述(最多60個字)
編輯
此外還可以使用.str.slice()方法,其參數與切片方法的類似:
點擊添加圖片描述(最多60個字)
編輯
但是如果想根據字符串索引來取單個字符元素,可以通過.str.get()方法來進行。比如上面的Series對象a中,我們想要取裡面所有字符串索引值為1的元素,可以寫a.str.get(1):
點擊添加圖片描述(最多60個字)
編輯
(2) 字符串拼接
Python中多個字符串對象拼接非常簡單,直接使用加法運算符就可以了,比如:
點擊添加圖片描述(最多60個字)
編輯
這種便捷的方法,Series對象也同樣沿用下來,可以將多個字符型Series對象用加法運算符直接相加:
點擊添加圖片描述(最多60個字)
編輯
但是Pandas字符串方法中有更加強大的字符串拼接功能,那就是.str.cat()方法。
實現上面同樣的字符串拼接,如果我們使用.str.cat()方法,可以這樣寫:
點擊添加圖片描述(最多60個字)
編輯
也就是說,第一個Series對象調用.str.cat()方法,該方法第一個參數可以用列表的形式來把其他需要合併的Series對象寫進來。
當然,.str.cat()方法功能強大,比如可以選擇使用參數sep來自定義分隔符來合併,我們使用「|」來連接上面的三個Series對象:
點擊添加圖片描述(最多60個字)
編輯
(3) 字符替換操作
字符串內建函數有便捷的字符替換方法.replace(),比如我們想字符串』abcd』中的』a』替換成』A』:
點擊添加圖片描述(最多60個字)
編輯
同樣地,Pandas字符串方法也有一樣的操作:
點擊添加圖片描述(最多60個字)
編輯
當然,如果想通過索引值或者切片來指定替換呢?比如我們想將str_01中的所有字符串中索引值0到2的元素替換成符號『*』,我們就需要使用.str.slice_replace(),替換對象以參數repl來指定:
點擊添加圖片描述(最多60個字)
編輯
(4) 快速獨熱編碼
獨熱編碼無論在特徵工程中還是問卷數據處理中都應用廣泛,我們需要轉碼的字符如下圖表示,該怎麼辦?
點擊添加圖片描述(最多60個字)
編輯
想看到這,熟練使用Pandas的apply()方法的同學會開始絞盡腦汁寫自定義函數來完成這麼複雜的編碼規則。其實,我們可以直接使用Pandas字符串方法.str.get_dummies()來完成獨熱編碼,如下:
點擊添加圖片描述(最多60個字)
編輯
如果非常不幸,我們的字符串中的分隔符」|」都不存在,該怎麼辦?
點擊添加圖片描述(最多60個字)
編輯
此時我們可以使用搭配使用.str.join()方法,將「|」插入到上面Series對象中每個字符串對象的每個元素之間:
點擊添加圖片描述(最多60個字)
編輯
上面生成的對象最後再次調用.str.get_dummies()方法即可:
點擊添加圖片描述(最多60個字)
編輯
3. 代碼量與運算效率PK
從上面我們可以看到,Pandas的字符串方法實現了很多我們意想不到的操作的同時,大大簡化了代碼書寫的複雜程度。
接下來,我們對比一下,在文本數據量較大的時候,使用Pandas字符串方法和使用字符串內建函數,在代碼量上和代碼運算效率上作一番比較。
我們以最為常用的幾個使用場景來舉例子,分別是字符切片、替換、拼接、去除前後特殊字符。
下面用到的內存分析魔法函數,需要先在pip安裝擴展memory_profiler:
pip install memory_profiler
然後還需要在notebook中導入這個擴展:
%load_ext memory_profiler
(1) 字符串切片方法對比
我們先建立一個長度為一千萬的字符型Series對象:
點擊添加圖片描述(最多60個字)
編輯
我們嘗試使用兩種方法,對Series對象中的所有字符對象取前兩個元素:
點擊添加圖片描述(最多60個字)
編輯
上面我們會發現第一種方法使用列表推導式配合字符串切片方法,會比第二種使用Pandas字符串方法佔用內存要大且運算時間稍慢。
同時,Pandas字符串方法的代碼簡潔很多。
(5) 字符串替換方法對比
同理按照以上的方法,我們對比一下兩種字符串方法的在字符串替換上的運算效率:
點擊添加圖片描述(最多60個字)
編輯
上圖可以看到,無論是代碼簡潔性、可閱讀性,還是運算效率方面,Pandas的字符串方法都要好很多。
(6) 字符串拼接方法對比
多個字符型Series對象拼接在一起,同時使用分隔符「|」拼接,我們對比一下兩種寫法:
點擊添加圖片描述(最多60個字)
編輯
可以看到在拼接方法上,雖然代碼的簡潔性與拓展性,Pandas的字符串方法要好很多,但是其運算效率要比第一種方法要低很多。
這主要是因為第一種方法使用了廣播機制,加快了運算效率。
(7) 去除前後特殊字符
去除字符串前後的特殊字符,比如空格,是字符串處理的常見操作,我們看看使用Pandas的.str.strip()方法是否在各方面要好很多。
先建一個例子:
點擊添加圖片描述(最多60個字)
編輯
第一種方法我們依然使用列表推導式與字符串內建函數:
點擊添加圖片描述(最多60個字)
編輯
第二種方法:
點擊添加圖片描述(最多60個字)
編輯
第二種方法我們會看到,雖然運算時間稍微比第一種方法高了一點,但是代碼簡潔性和可閱讀性要比第一種方法好很多,而且運算內存消耗要低很多。
4. 小結
從上面這麼多的例子我們會發現,Pandas的字符串方法無論是在代碼可閱讀性還是運算效率方面,在實現各種字符串處理場景時,基本上都要比其他方法要好很多。而在實現特定字符串處理場景,比如獨熱編碼時,Pandas特有的字符串方法就更加便捷。
作為實用主義者,我們在處理文本數據的時候,可以優先使用Pandas字符串方法。遇到尤為棘手的處理需求時,結合字符串內建函數與Pandas的apply(),你就可以建立一個功能強大無比的字符串處理程序來清洗自己數據了。