第7章 pandas文本數據初學者需要掌握的幾種基本的數據預處理方法

2021-01-11 酷扯兒

本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫

文章目錄

一、string類型的性質1. string與object的區別2. string類型的轉換二、拆分與拼接1. str.split方法2. str.cat方法三、替換2. 子組與函數替換四、子串匹配與提取1. str.extract方法2. str.extractall方法3. str.contains和str.match五、常用字符串方法1. 過濾型方法2. isnumeric方法

import pandas as pd

import numpy as np

一、string類型的性質

1. string與object的區別

string類型和object不同之處有三:

① 字符存取方法(string accessor methods,如str.count)會返回相應數據的Nullable類型,而object會隨缺失值的存在而改變返回類型

② 某些Series方法不能在string上使用,例如:Series.str.decode(),因為存儲的是字符串而不是字節

③ string類型在缺失值存儲或運算時,類型會廣播為pd.NA,而不是浮點型np.nan

其餘全部內容在當前版本下完全一致,但迎合Pandas的發展模式,我們仍然全部用string來操作字符串

2. string類型的轉換

如果將一個其他類型的容器直接轉換string類型可能會出錯:

#pd.Series([1,'1.']).astype('string') #報錯

#pd.Series([1,2]).astype('string') #報錯

#pd.Series([True,False]).astype('string') #報錯

當下正確的方法是分兩部轉換,先轉為str型object,在轉為string類型:

pd.Series([1,'1.']).astype('str').astype('string')

pd.Series([1,2]).astype('str').astype('string')

pd.Series([True,False]).astype('str').astype('string')

二、拆分與拼接

1. str.split方法

(a)分割符與str的位置元素選取

s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")

s

根據某一個元素分割,默認為空格

s.str.split('_')

這裡需要注意split後的類型是object,因為現在Series中的元素已經不是string,而包含了list,且string類型只能含有字符串

對於str方法可以進行元素的選擇,如果該單元格元素是列表,那麼str[i]表示取出第i個元素,如果是單個元素,則先把元素轉為列表在取出

s.str.split('_').str[1]

pd.Series(['a_b_c', ['a','b','c']], dtype="object").str[1]

#第一個元素先轉為['a','_','b','_','c']

(b)其他參數

expand參數控制了是否將列拆開,n參數代表最多分割多少次

s.str.split('_',expand=True)

s.str.split('_',n=1)

s.str.split('_',expand=True,n=1)

2. str.cat方法

(a)不同對象的拼接模式

cat方法對於不同對象的作用結果並不相同,其中的對象包括:單列、雙列、多列

① 對於單個Series而言,就是指所有的元素進行字符合併為一個字符串

s = pd.Series(['ab',None,'d'],dtype='string')

s

s.str.cat()

其中可選sep分隔符參數,和缺失值替代字符na_rep參數

s.str.cat(sep=',')

s.str.cat(sep=',',na_rep='*')

②對於兩個Series合併而言,是對應索引的元素進行合併

s2 = pd.Series(['24',None,None],dtype='string')

s2

s.str.cat(s2)

同樣也有相應參數,需要注意的是兩個缺失值會被同時替換

s.str.cat(s2,sep=',',na_rep='*')

③多列拼接可以分為表的拼接和多Series拼接

表的拼接

s.str.cat(pd.DataFrame({0:['1','3','5'],1:['5','b',None]},dtype='string'),na_rep='*')

多個Series拼接

s.str.cat([s+'0',s*2])

(b)cat中的索引對齊

當前版本中,如果兩邊合併的索引不相同且未指定join參數,默認為左連接,設置join=『left』

s2 = pd.Series(list('abc'),index=[1,2,3],dtype='string')

s2

s.str.cat(s2,na_rep='*')

三、替換

廣義上的替換,就是指str.replace函數的應用,fillna是針對缺失值的替換,上一章已經提及

提到替換,就不可避免地接觸到正則表達式,這裡默認讀者已掌握常見正則表達式知識點,若對其還不了解的,可以通過這份資料來熟悉

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca','', np.nan, 'CABA', 'dog', 'cat'],dtype="string")

s

第一個值寫r開頭的正則表達式,後一個寫替換的字符串

s.str.replace(r'^[AB]','***')

2. 子組與函數替換

通過正整數調用子組(0返回字符本身,從1開始才是子組)

s.str.replace(r'([ABC])(\w+)',lambda x:x.group(2)[1:]+'*')

利用?P<…>表達式可以對子組命名調用

s.str.replace(r'(?P<one>[ABC])(?P<two>\w+)',lambda x:x.group('two')[1:]+'*')

3.關於str.replace的注意事項

首先,要明確str.replace和replace並不是一個東西:

str.replace針對的是object類型或string類型,默認是以正則表達式為操作,目前暫時不支持DataFrame上使用

replace針對的是任意類型的序列或數據框,如果要以正則表達式替換,需要設置regex=True,該方法通過字典可支持多列替換

但現在由於string類型的初步引入,用法上出現了一些問題,這些issue有望在以後的版本中修復

(a)str.replace賦值參數不得為pd.NA

這聽上去非常不合理,例如對滿足某些正則條件的字符串替換為缺失值,直接更改為缺失值在當下版本就會報錯

#pd.Series(['A','B'],dtype='string').str.replace(r'[A]',pd.NA) #報錯

#pd.Series(['A','B'],dtype='O').str.replace(r'[A]',pd.NA) #報錯

此時,可以先轉為object類型再轉換回來,曲線救國:

pd.Series(['A','B'],dtype='string').astype('O').replace(r'[A]',pd.NA,regex=True).astype('string')

至於為什麼不用replace函數的regex替換(但string類型replace的非正則替換是可以的),原因在下面一條

(b)對於string類型Series,在使用replace函數時不能使用正則表達式替換

該bug現在還未修復

pd.Series(['A','B'],dtype='string').replace(r'[A]','C',regex=True)

pd.Series(['A','B'],dtype='O').replace(r'[A]','C',regex=True)

(c)string類型序列如果存在缺失值,不能使用replace替換

#pd.Series(['A',np.nan],dtype='string').replace('A','B') #報錯

pd.Series(['A',np.nan],dtype='string').str.replace('A','B')

綜上,概況的說,除非需要賦值元素為缺失值(轉為object再轉回來),否則請使用str.replace方法

四、子串匹配與提取

1. str.extract方法

(a)常見用法

pd.Series(['10-87', '10-88', '10-89'],dtype="string").str.extract(r'([\d]{2})-([\d]{2})')

使用子組名作為列名

pd.Series(['10-87', '10-88', '-89'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})-(?P<name_2>[\d]{2})')

利用?正則標記選擇部分提取

pd.Series(['10-87', '10-88', '-89'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})?-(?P<name_2>[\d]{2})')

pd.Series(['10-87', '10-88', '10-'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})-(?P<name_2>[\d]{2})?')

(b)expand參數(默認為True)

對於一個子組的Series,如果expand設置為False,則返回Series,若大於一個子組,則expand參數無效,全部返回DataFrame

對於一個子組的Index,如果expand設置為False,則返回提取後的Index,若大於一個子組且expand為False,報錯

s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"], dtype="string")

s.index

s.str.extract(r'([\w])')

s.str.extract(r'([\w])',expand=False)

s.index.str.extract(r'([\w])')

s.index.str.extract(r'([\w])',expand=False)

s.index.str.extract(r'([\w])([\d])')

#s.index.str.extract(r'([\w])([\d])',expand=False) #報錯

2. str.extractall方法

與extract只匹配第一個符合條件的表達式不同,extractall會找出所有符合條件的字符串,並建立多級索引(即使只找到一個)

s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"],dtype="string")

two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'

s.str.extract(two_groups, expand=True)

s.str.extractall(two_groups)

s['A']='a1'

s.str.extractall(two_groups)

如果想查看第i層匹配,可使用xs方法

s = pd.Series(["a1a2", "b1b2", "c1c2"], index=["A", "B", "C"],dtype="string")

s.str.extractall(two_groups).xs(1,level='match')

3. str.contains和str.match

前者的作用為檢測是否包含某種正則模式

pd.Series(['1', None, '3a', '3b', '03c'], dtype="string").str.contains(r'[0-9][a-z]')

可選參數為na

pd.Series(['1', None, '3a', '3b', '03c'], dtype="string").str.contains('a', na=False)

str.match與其區別在於,match依賴於python的re.match,檢測內容為是否從頭開始包含該正則模式

pd.Series(['1', None, '3a_', '3b', '03c'], dtype="string").str.match(r'[0-9][a-z]',na=False)

pd.Series(['1', None, '_3a', '3b', '03c'], dtype="string").str.match(r'[0-9][a-z]',na=False)

五、常用字符串方法

1. 過濾型方法

(a)str.strip

常用於過濾空格

pd.Series(list('abc'),index=[' space1 ','space2 ',' space3'],dtype="string").index.str.strip()`在這裡插入代碼片`

(b)str.lower和str.upper

pd.Series('A',dtype="string").str.lower()

pd.Series('a',dtype="string").str.upper()

(c)str.swapcase和str.capitalize

分別表示交換字母大小寫和大寫首字母

pd.Series('abCD',dtype="string").str.swapcase()

pd.Series('abCD',dtype="string").str.capitalize()

2. isnumeric方法

檢查每一位是否都是數字,請問如何判斷是否是數值?(問題二)

pd.Series(['1.2','1','-0.3','a',np.nan],dtype="string").str.isnumeric()

相關焦點

  • 第8章 pandas分類數據(初學者必學)
    本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫在拿到一份數據準備做挖掘建模之前,首先需要進行初步的數據探索性分析,對數據探索性分析之後要先進行一系列的數據預處理步驟。
  • Python數據分析:pandas讀取和寫入數據
    我的公眾號是關於自己在數據分析/挖掘學習過程中的一些技術和總結分享,文章會持續更新......繼續深入學習pandas相關操作,數據讀取寫入、分組、合併,轉換等等。前面一篇文章裡已經寫了關於描述性統計以及常用的基本操作。接下來的一段時間裡,我將陸續地去掌握並輸出。這篇文章是關於數據讀取與寫入的知識點。
  • 5個可以幫助pandas進行數據預處理的可視化圖表
    數據科學和機器學習項目的結構化方法從項目目標開始。同一組數據點可以推斷出一些有意義的信息。基於我們所尋找的,我們需要關注數據的另一個方面。一旦我們明確了目標,我們就應該開始考慮我們需要的數據點。這將使我們能夠專注於最相關的信息集,而忽略可能不重要的數據集。
  • pandas指南:做更高效的數據科學家
    你需要有經驗的人來告訴你。今天我要告訴你們的是:在數據科學中,有一個軟體包是你們絕對需要學習的,那就是pandas。而pandas真正有趣的地方是,很多其他的包也在裡面。pandas是一個核心包,因此它具有來自其他各種包的特性。pandas類似於Python中的Excel:它使用表(即DataFrame)並對數據進行轉換,但它還能做更多。
  • 未明學院:7張思維導圖掌握數據分析關鍵庫pandas
    原創: 未明學院Pandas是一個強大的分析結構化數據的工具集;它基於numpy,用於數據分析和數據挖掘,同時也提供數據清洗功能。pandas與numpy一起構成了數據分析的基礎雙生庫。今天小明邀請了未明的王老師,給大家總結了pandas的核心知識,主要包括以下幾個方面。pandas核心知識01、首先我們來認識一下pandas的一些基本概念。pandas概述02在使用pandas做數據分析的時候往往第一步就是將數據導入進來,比如csv或者excel格式的數據,下面這張圖就是我們讀取數據時候的方法和參數。
  • 第5章 精通pandas合併操作(使用pandas進行數據分析,)
    本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫文章目錄第5章 合併一、append與assign1. append方法2. assign方法二、combine與update1. comine方法2. update方法三、concat方法四、merge與join1. merge函數
  • 懂Excel就能輕鬆入門Python數據分析包pandas(七):分列
    後來才發現,原來不是 Python 數據處理厲害,而是他有數據分析神器—— pandas前言今天從兩個需求來看看數據分列功能,由於 Excel 自帶功能比較弱,在處理稍微複雜的需求時會顯得力不從心,因此,本系列文章將引入 Excel 中一個非常高效的數據處理插件—— Power Query,並且看看 pandas 是怎樣靈活解決。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    ,哪個系統都一樣,初學者只需選擇自己熟悉的系統學習相應課程即可。 6多態 7類屬性,類方法,靜態方法 8單例模式 9異常 10模塊和包 11文件操作 12文本編碼 13內建函數eval 3項目實戰部分:1項目準備 2遊戲窗口和繪製圖像 3遊戲循環和鍵盤事件 4精靈和精靈組 5框架搭建
  • 數值數據的特徵預處理
    特徵預處理是數據挖掘中最重要的步驟。在這篇文章中,我將向你介紹特徵預處理的概念,它的重要性,不同的機器學習模型下的數值特徵的不同特徵預處理技術。模型的質量在很大程度上取決於輸入模型的數據。當從數據挖掘過程中收集數據時,會丟失一些數據(我們將其稱為丟失值)。此外,它很容易受到噪音的影響。
  • Python學習120課 pandas簡介kaggle下載數據及pandas讀取外部數據
    【每天幾分鐘,從零入門python編程的世界!】numpy的基本的東西我們學習差不多了,後面具體應用中遇到問題具體分析,然後去深入了解遇到的新的知識點就行。現在我們開始學習pandas,pandas一般用的更多,pandas是基於numpy去寫的。pandas是一個專門做數據結構和數據分析的庫。
  • 數據挖掘非常重要的一步:數據預處理
    為什麼數據處理很重要對數據挖掘熟悉的小夥伴,數據處理相關佔據了整個項目的工作時間60%以上的。數據的質量,直接決定了模型的預測和泛化能力的好壞。它涉及很多因素,包括:準確性、完整性、一致性、可信性和解釋性。
  • 題庫 | 神經網絡數據預處理方法有哪些?
    其提出了 MSRA 的初始化方法,來解決該問題。 題目3:神經網絡數據預處理方法有哪些?1、0 均值是最常用的預處理方法,就是把數據的每一維 - 每一維的均值,這樣數據就變成 0 均值的了。在 numpy 中,這個操作可以寫成:X -= np.mean (X, axis = 0)。
  • python數據分析——pandas導入數據合集
    導入pandas庫import pandas as pd1.導入csv\txt文件數據pd.read_csv()常用參數:filepath_or_buffer:文件路徑(必填,其他參數按需求填寫)sep:指定分隔符,默認逗號','。header:指定第幾行作為表頭。
  • 數據工程師需要掌握的 18 個 Python 庫
    作者 | 劉早起早起責編 | 屠敏本文對Python中在數據分析中需要掌握的庫進行了整理,一起來看看吧!所以使用 pip install Twisted-18.9.0-cp37-cp37m-win32.whl 來安裝,然後使用pip install scrapy 來安裝scrapy就可以了數據獲取Beautiful SoupBeautiful Soup也是一個從網站爬取數據的庫,他提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。
  • 想成為高效數據科學家?不會Pandas怎麼行
    要想成為一名高效的數據科學家,不會 Pandas 怎麼行?Python 是開源的,它很棒,但是也無法避免開源的一些固有問題:很多包都在做(或者在嘗試做)同樣的事情。如果你是 Python 新手,那麼你很難知道某個特定任務的最佳包是哪個,你需要有經驗的人告訴你。有一個用於數據科學的包絕對是必需的,它就是 pandas。
  • Pandas自動進行探索性數據分析,節省可視化和理解數據的時間
    根據Wikipedia的說法,探索性數據分析(EDA)是一種分析數據集以總結其主要特徵的方法,通常使用視覺方法。因此,EDA是理解基礎數據,變量分布及其相關性的過程。這使得EDA成為構建任何統計模型之前任何數據科學過程中的第一步。
  • Pandas可視化綜合指南:手把手從零教你繪製數據圖表
    最近,一位來自印度的小哥以2019年世界幸福指數的數據為例,詳細講述了在Pandas中plot()函數的各種參數設置的小技巧,熟練掌握這些技巧後,你也能繪製出豐富多彩的可視化圖表。導入數據在繪製圖形前,我們首先需要導入csv文件:import pandas as pddf=pd.read_csv(『.
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    在當今社會,網際網路上充斥著許多有用的數據。我們只需要耐心觀察並添加一些技術手段即可獲得大量有價值的數據。而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?
  • Pandas的介紹與基本使用
    1、什麼是Pandas當大家談論到數據分析時,提及最多的語言就是Python和SQL,而Python之所以適合做數據分析,就是因為他有很多強大的第三方庫來協助,pandas就是其中之一,它是基於Numpy構建的,正因pandas的出現,讓Python語言也成為使用最廣泛而且強大的數據分析環境之一。
  • NumPy庫中數組數據文件的讀寫
    這在數據分析中很常見,因為要分析的數據集通常都很大,所以由人工來管理這類事務的執行,以及接下來的從一臺計算機或計算過程的一段會話讀取數據到另一臺計算機或另一段會話,是不可取甚至不可能的。鑑於此,NumPy提供了幾個函數,數據分析師可用其把結果保存到文本或二進位文件中。類似地,NumPy還提供了從文件中讀取數據並將其轉換為數組的方法。