傻傻分不清系列|Python中各種字串處理方法

Python易混淆知識系列:Pandas字串方法和字串內建函式,

使用

Python

的一個優勢就是字串處理起來比較容易。

Python

的初學者在學習字串內建函式的時候往往會很困惑:字串的內建函式是對單個字串物件處理,如果要對成千上萬個字串物件處理該怎麼辦?

不少已經使用

Python

工作很長時間的同學,即使已經學會使用

Pandas

物件的。apply()方法來處理字串,依然會時常忘記:其實

Pandas

已經自帶功能強大的向量化字串操作。

即使知道

Pandas

字串方法的同學,使用的時候也經常與字串內建函式混淆。

而熟練使用

Pandas

字串方法的同學往往會覺得,其方法的程式碼簡潔性與執行效率都遠高於其他的寫法。真相到底如何?

Pandas

字串方法和字串內建函式有什麼不同?運算效率真的像傳聞那麼高嗎?

今天我們就好好捋一下這塊

Python

易混淆的知識點。

1. 快速入門向量化字串操作

初學

Python

字串內建函式的同學肯定知道有個叫。lower()的方法可以將字串中的大寫英文字母轉化為小寫,比如將字串物件’ABCD’轉化為小寫:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

如果字元型的Series物件中的字串要轉化為小寫呢?比如:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

此時,我們就可以使用Series的str方法中的。lower()來處理:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多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物件為例:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

如果想把上面Series物件中所有字串中的前三個字母取出來,可以透過呼叫。str屬性後,返回的物件直接使用和字串切片一樣的方法:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

此外還可以使用。str。slice()方法,其引數與切片方法的類似:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

但是如果想根據字串索引來取單個字元元素,他社突可以透過。str。get()方法來進夜膊鐘行。比如上面的Series物件a中,我們想要取裡面所有字串索引值為1的元須最素,可以寫a。str。get(1):

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

(2) 字串拼接

Python

中多個字串物件拼接非常簡單,直接使用加法運算子就可以了,比如:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

這種便捷的方法,Series物件也同樣沿用下來,可以將多個字元型Series物件用加法運算子直接相加:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

但是

Pandas

字串方法中有更加強大的字串拼接功能,那就是。str。cat()方法。

實現上面同樣的字串拼接,如果我們使用。str。cat()方法,可以這樣寫:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

也就是說,第一個Series物件呼叫。str。cat()方法,該方法第一個引數可以用列表的形式來把其他需要合併的Series物件寫進來。

當然,。str。cat()方法功能強大,比如可以選擇使用引數sep來自定義分隔符來合併,我們使用“|”來連線上面的三個Series物件:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

(3) 字元替換操作

字串內建函式有便捷的字元替換方法。replace(),比如我們想字串’abcd’中的’a’替換成’A’:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

同樣地,

Pandas

字串方法也有一樣的操作:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

當然,如果想透過索引值或者切片來指定替換呢?比如我們想將str_01中的所有字串中索引值0到2的元素替換成符號‘*’,我們就需要使用。str。slice_replace(),替換物件以引數repl來指定:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

(4) 快速獨熱編碼

獨熱編碼無論在特徵工程中還是問卷資料處理中都應用廣泛,我們需要轉碼的字元如下圖表示,該怎麼辦?

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

想看到這,熟練使用

Pandas

的apply()方法的同學會開始絞盡腦汁寫自定義函式來完成這麼複雜的編碼規則。其實,我們可以直接使用

Pandas

字串方法。str。get_dummies()來完成獨熱編碼,如下:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

如果非常不幸,我們的字串中的分隔符”|”都不存在,該怎麼辦?

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

此時我們可以使用搭配使用。str。join()方法,將“|”插入到上面Series物件中每個字串物件的每個元素之間:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

上面生成的物件最後再次呼叫。str。get_dummies()方法即可:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

3。 程式碼量與運算效率PK

從上面我們可以看到,

Pandas

的字串方法實現了很多我們意想不到的操作的同時,大大簡化了程式碼書寫的複雜程度。

接下來,我們對比一下,在文字資料量較大的時候,使用

Pandas

字串方法和使用字串內建函式,在程式碼量上和程式碼運算效率上作一番比較。

我們以最為常用的幾個使用場景來舉例子,分別是字元切片、替換、拼接、去除前後特殊字元。

下面用到的記憶體分析魔法函式,需要先在pip安裝擴充套件memory_profiler:

pip install memory_profiler

然後還需要在notebook中匯入這個擴充套件:

%load_ext memory_profiler

(1) 字串切片方法對比

我們先建立一個長度為一千萬的字元型Series物件:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

我們嘗試使用兩種方法,對Series物件中的所有字元物件取前兩個元素:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

上面我們會發現第一種方法使用列表推導式配合字串切片方法,會比第二種使用

Pandas

字串方法佔用記憶體要大且運算時間稍慢。

同時,

Pandas

字串方法的程式碼簡潔很多。

(5) 字串替換方法對比

同理按照以上的方法,我們對比一下兩種字串方法的在字串替換上的運算效率:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

上圖可以看到,無論是程式碼簡潔性、可閱讀性,還是運算效率方面,

Pandas

的字串方法都要好很多。

(6) 字串拼接方法對比

多個字元型Series物件拼接在一起,同時使用分隔符“|”拼接,我們對比一下兩種寫法:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

可以看到在拼接方法上,雖然程式碼的簡潔性與拓展性,

Pandas

的字串方法要好很多,但是其運算效率要比第一種方法要低很多。

這主要是因為第一種方法使用了廣播機制,加快了運算效率。

(7) 去除前後特殊字元

去除字串前後的特殊字元,比如空格,是字串處理的常見操作,我們看看使用

Pandas

的。str。strip()方法是否在各方面要好很多。

先建一個例子:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

第一種方法我們依然使用列表推導式與字串內建函式:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

第二種方法:

傻傻分不清系列|Python中各種字串處理方法

點選新增圖片描述(最多60個字)

編輯

第二種方法我們會看到,雖然運算時間稍微比第一種方法高了一點,但是程式碼簡潔性和可閱讀性要比第一種方法好很多,而且運算記憶體消耗要低很多。

4。 小結

從上面這麼多的例子我們會發現,

Pandas

的字串方法無論是在程式碼可閱讀性還是運算效率方面,在實現各種字串處理場景時,基本上都要比其他方法要好很多。而在實現特定字串處理場景,比如獨熱編碼時,Pandas特有的字串方法就更加便捷。

作為實用主義者,我們在處理文字資料的時候,可以優先使用

Pandas

字串方法。遇到尤為棘手的處理需求時,結合字串內建函式與

Pandas

的apply(),你就可以建立一個功能強大無比的字串處理程式來清洗自己資料了。