(數據科學學習手札131)pandas中的常用字元串處理方法總結

本文示例程式碼及文件已上傳至我的Github倉庫//github.com/CNFeffery/DataScienceStudyNotes

1 簡介

  在日常開展數據分析的過程中,我們經常需要對字元串類型數據進行處理,此類過程往往都比較繁瑣,而pandas作為表格數據分析利器,其內置的基於Series.str訪問器的諸多針對字元串進行處理的方法,以及一些top-level級的內置函數,則可以幫助我們大大提升字元串型數據處理的效率。

  本文我就將帶大家學習pandas中常用的一些高效字元串處理方法,提升日常數據處理分析效率😋:

2 pandas常用字元串處理方法

   pandas中的常用字元串處理方法,可分為以下幾類:

2.1 拼接合成類方法

  這一類方法主要是基於原有的Series數據,按照一定的規則,利用拼接或映射等方法合成出新的Series,主要有:

2.1.1 利用join()方法按照指定連接符進行字元串連接

  當原有的Series中每個元素均為列表,且列表中元素均為字元串時,就可以利用str.join()來將每個列表按照指定的連接符進行連接,主要參數有:

  • sep: str型,必選,用於設置連接符

  它除了可以簡化我們常規使用apply()配合’連接符’.join(列表)`實現的等價過程之外,還可以在列表中包含非字元型元素時自動跳過此次拼接返回缺失值,譬如下面的例子:

s = pd.Series([
    ['a', 'b', 'c'],
    [1, 'a', 'b'],
    list('pandas')
])

s.str.join('-')

2.1.2 利用cat()方法進行字元串拼接

  當需要對整個序列進行拼接,或者將多個序列按位置進行元素級拼接時,就可以使用str.cat()方法來加速這個過程,其主要參數有:

  • others: 序列型,可選,用於傳入待進行按位置元素級拼接的字元串序列對象
  • sep: str型,可選,用於設置連接符,默認為''
  • na_rep: str型,可選,用於設置對缺失值的替換值,默認為None時:
    • others參數未設置時,返回的拼接結果中缺失項自動跳過
    • others參數設置時,兩邊的序列對應位置上存在缺失值時,拼接結果對應位置返回缺失值

  下面是一些簡單的例子:

2.2 判斷類方法

  判斷類方法在這裡指的是針對字元型Series,按照一定的條件判斷從而返回與原序列等長的bool型序列,可進一步輔助數據篩選等操作,在pandas中此類字元串處理方法主要有:

2.2.1 利用startswith()與endswith()匹配字元串首尾

  當我們需要判斷字元型Series中的每個元素是否以某段字元片段開頭或結尾時,就可以使用到startswith()/endswith(),它們的參數一致:

  • pat: str型,用於定義要檢查的字元片段
  • na: 任意對象,當對應位置元素為空值時,用於自定義該位置返回判斷結果,默認為NaN,會原值返回,通常建議設置為False

  下面是一些簡單的例子:

2.2.2 利用contains()判斷是否包含指定模式

  當我們想要判斷字元型Series中每個元素,是否包含指定的字元片段或正則模式時,則可以使用到str.contains()方法,其主要參數有:

  • pat: str型,必選,用於定義要檢查的字元模式,當regex=True時表示正則表達式,當regex=False時,表示原始字元串片段
  • flags: int型,可選,對應re模組中的flags參數,用於配合正則表達式模式,實現更多功能,譬如re.IGNORECASE即代表大小寫忽略
  • na: 用於自定義遇到缺失值時返回的對象,通常建議設置為False
  • regex: bool型,用於設置是否將pat參數視為正則表達式進行解析,默認為True

  下面是一些簡單的例子:

2.2.3 利用match()判斷是否以指定正則模式開頭

  類似前面介紹的startswith(),不同的是,match()支援正則表達式,可以幫助掌握正則表達式的用戶拓展匹配能力,其主要參數有:

  • pat: str型,必選,用於定義要檢查的字元模式,當regex=True時表示正則表達式,當regex=False時,表示原始字元串片段
  • flags: int型,可選,對應re模組中的flags參數,用於配合正則表達式模式,實現更多功能,譬如re.IGNORECASE即代表大小寫忽略
  • na: 用於自定義遇到缺失值時返回的對象,通常建議設置為False

  下面是一些簡單的例子:

2.2.4 利用fullmatch()判斷字元串是否完整滿足指定正則模式

  上面介紹的match()局限性在於只能從開頭匹配是否滿足指定正則表達式,而從pandas1.1.0版本開始,新增了fullmatch()方法,可以幫助我們傳入正則表達式來判斷目標字元串是否可以完全匹配,其參數同match(),下面是一個簡單的例子:

2.3 生成型方法

  生成型方法這裡指的是,基於原有的單列字元型Series數據,按照一定的規則產生出新計算結果的一系列方法,pandas中常用的有:

2.3.1 利用slice()進行字元切片

  當我們想要對字元型Series進行元素級的切片操作時,就可以用到str.slice(),其三個參數依次為startstopstep,分別代表切片的開始下標、結束下標與步長,與Python原生的切片方式一致,下面是一些簡單的例子(也可以直接使用類似Python[start:stop:step]):

2.3.2 利用replace()對指定字元片段或正則模式進行替換

  當我們希望對字元型Series進行元素級的字元片段/正則模式替換時,就可以使用到str.replace()方法,其除了常規的patflagsregex等參數外,還有特殊的參數n用於設置每個元素字元串(默認為-1即不限制次數),參數repl用於設置填充的新內容,從開頭開始總共替換幾次,下面是一些簡單的例子:

2.3.3 利用split()按照指定字元片段或正則模式拆分字元串

  利用str.split()方法,我們可以基於指定的字元片段或正則模式對原始字元Series進行元素級拆分,主要參數有patn,同上文類似的參數設定,另外還有特殊參數expand來設定對於是否以DataFrame中不同列的形式存儲拆分結果,默認為False。下面是一些簡單的例子:

2.3.4 利用findall()提取符合指定模式的片段

  利用findall(),可以按照指定的字元片段/正則模式對字元型Series進行元素級提取,可用的參數有patflags,下面是一些簡單的例子:

2.3.5 利用count()進行頻數統計

  通過count(),我們可以對指定的字元片段/正則模式在字元型Series中每個字元串元素中出現的次數進行統計,其參數同上文中的findall(),下面是一些簡單的例子:

2.4 特殊型方法

  除了上述介紹到的字元串處理方法外,pandas中還有一些特殊方法,可以配合字元串解決更多處理需求,典型的有:

2.4.1 利用get_dummies()方法生成啞變數

  在涉及到機器學習特徵工程的過程中,我們可以使用到str.get_dummies()方法來對具有固定分隔符的字元串進行啞變數的生成,它只有一個參數sep,用於設置分隔符,暫時不支援正則模式:

2.4.2 利用pd.to_numeric()修複數值錯誤

  有些情況下,我們從外部數據源(如excel表)中讀入的數據,由於原始數據文件加工的問題,導致一些數值型欄位中的某些單元格混入非數值型字元,如:

  這種情況下,直接讀入的數據,本應該為數值型的欄位會變成object型:

  這種時候就可以利用pd.to_numeric()方法,設置參數errors='coerce',就可以將可以合法轉為數值型的記錄轉換為相應的數值,不合法的位置返回缺失值:


  以上就是本文的全部內容,歡迎在評論區與我進行討論~