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

2021-01-07 CDA數據分析師

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(),你就可以建立一個功能強大無比的字符串處理程序來清洗自己數據了。

相關焦點

  • 傻傻分不清楚系列|Python中各種時間處理方法(上)
    相信大多數數據分析師在入手Python的時候,在學習到time庫與datetime庫時,都會對兩個庫裡面長得很像,又相互有關聯的各種類和方法感到非常窩心。當接觸到pandas處理時間序列的方法時,再次發現其中各種類和方法又和前面兩個時間庫的方法「長得好像又似乎有點不同」,此時,想必每個強迫症內心早已經發出「土撥鼠吶喊」。
  • 13-python中的字符串
    通過前兩天的文章12-python中的集合我們學習了有關集合的知識,今天我們將學習一下python中的字符串。(一)字符串的介紹    字符串,是python中的基本數據類型,是一個不可變的字符序列。    字符串的駐留機制,是僅保留一份相同且不可變字符串的一種方法。
  • 10 個 Python 字符串處理技巧
    (給Python開發者加星標,提升Python技能)來源:數據派THU在探尋文本分析途徑時卻不知從何下手,該怎麼辦?
  • Python字符串處理的8招秘籍
    Python的字符串處理,在爬蟲的數據解析、大數據的文本清洗,以及普通文件處理等方面應用非常廣泛,而且Python對字符串的處理內置了很多高效的函數,功能非常強大、使用非常方便。今天我就把字符串處理時用到最多的方法總結分享給大家,希望大家可以輕鬆應對字符串處理。
  • 秘籍:10個Python字符串處理技巧(附代碼)
    這些領域包括各種具體的技能和概念,在深入具體實踐之前需要對它們有徹底的理解,為此,必須掌握一些基本的字符串操作和處理技巧。在我看來,必須掌握兩種字符串處理技巧:首先是正則表達式,一種基於模式的文本匹配方法。關於正則表達式有許多精彩的介紹,但是喜歡通過視頻學習的朋友仍然可以從這個視頻中受益良多:https://youtu.be/Q1zLqfnEXdw?
  • 【python速查系列】字符串系列使用速查--分割
    」字符串的分割也是我們日常生活中常用的,本篇提供一些常用方法的實例,方便大家用到的時候查詢。字符串的分割,通常有split 和partition 系列方法。split 系列split 系列方法包括split() 、rsplit() 、splitlines() 等。
  • 一文詳解Python字符串條件判斷方法
    作者 | 張小吉來源 | 雞仔說(ID:jizaishuo)前言人喜歡為自己的錯誤
  • 獨家 | 秘籍:10個Python字符串處理技巧(附代碼)
    本文為你介紹利用Python處理字符串的一些基本操作。在探尋文本分析途徑時卻不知從何下手,該怎麼辦?那麼可以通過這個字符串處理入門教程,來了解一下利用Python處理字符串的一些基本操作。當前,自然語言處理和文本分析是研究和應用的熱點領域。
  • Python基礎知識點手冊——字符串方法(二)
    Example: '.'.join(['ab', 'pq', 'rs']) -> 'ab.pq.rs'返回一個由 iterable 中的字符串拼接而成的字符串。如果 iterable 中存在任何非字符串值則會引發 TypeError。調用該方法的字符串將作為元素之間的分隔。
  • Python字符串的45個方法詳解
    ,該方法與 rfind() 方法一樣,可以規定字符串的索引查找範圍[star,end),只不過如果子字符串不在字符串中會報一個異常。字符串中若只包含十進位字符返回True,否則返回False。該方法只存在於unicode對象中。注意:定義一個十進位字符串,只需要在字符串前添加前綴 'u' 即可。
  • python serise處理 60句 +字符串處理 40句
    錯的話反饋falses.copy()#複製serises.count()#計算s中的個數,不包含nan s1.cov(s2)#計算s1和s2的協方差s.describe()#s的描述性統計s.diff()#縱向一階差分,當前行減去上一行s.diff
  • 慢步學習二級python,字符串類型的操作:操作符,函數和方法
    繼續學習二級python考試的大綱內容:4.字符串類型的操作:字符串操作符,處理函數和處理方法學習字符串類型數據的操作是學習python的基礎。字符串操作符字符串常見操作符有2個+ *在應用中的意義是 連接 和 重複如上圖,第一個指令,「愛」+「你」,得到字符串「愛你」。
  • 左手用R右手Python系列13——字符串處理與正則表達式
    而且它不依賴任何軟體平臺,沒有屬於自己的GUI,就像是流動的水一樣,可以支持絕大多數主流程式語言。今天這一篇只給大家簡單介紹正則表達式基礎,涉及到一些常用的字符及符合含義,以及其在R語言和Python中所支持的常用函數。R語言中有兩套支持正則表達式的函數,基礎函數和stringr包中的字符串處理函數系統。
  • 【語言學習】python——字符串
    字符串的基本操作圖源:清華大學公眾號•python中一共提供了2類4中字符串的表示方法,如果希望在字符串中包含雙引號或者單引號。那麼如果想表示雙引號的話,字符串就用單引號,反之亦然。     •字符串的序號有正向遞增序號和反向遞減序號•正向遞增從0開始;•反向遞減從-1開始;•索引:返回字符串中單個字符 <字符串>[M].
  • Python字符串
    字符串序列用於表示和存儲文本,python中字符串是不可變對象。
  • python基礎之字符串處理
    python日常處理字符串較多,本文總結一下Python的日常使用,包括字符串的替換、刪除、截取、複製、連接、比較、查找、包含、大小寫轉換、分割等
  • Python字符串處理
    如何判斷字符串a是否以字符串b開頭或結尾問題:某文件系統目錄下有一系列文件:a.py,quicksort.c,stack.cpp,b.sh , 編寫程序給其中所有.sh文件和.py文件加上用戶可執行權限?
  • 基於NLTK的Python自然語言處理-字符串的操作(切分)
    上篇文檔已經介紹了做自然語言處理中我們使用比較的python語言,以及使用的python集成開發環境(IDE,Integrated Development Environment )。從本篇文章將陸續介紹如何使用python進行自然語言處理。
  • Python 中的時間處理
    ,融匯貫通三個模塊,才能隨心所欲地用python處理時間。第三部分表示的是實行DST的開始和結束時間,我們就不細解讀了。2.4 時間的表示,獲取,轉換time模塊中獲取時間的基本方法是它返回的是從epoch到現在的秒數(用浮點數表示),用的是UTC時間。我們自然而然地想把這個秒數轉為年月日時分秒的形式,而這種轉換又分兩種,一種還是用UTC時間,一種用我們所在時區進行調整後的時間。
  • python中的時間處理
    python中處理時間的模塊有三個,datetime, time,calendar,融匯貫通三個模塊,才能隨心所欲地用python