欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Pandas數據分析之pandas文本處理

 更新時間:2022年08月12日 10:39:48   作者:阡之塵埃  
這篇文章主要介紹了Pandas數據分析之pandas文本處理,pandas對文本數據也有很多便捷處理方法,可以不用寫循環(huán),向量化操作運算速度快,還可以進行高級的正則表達式,各種復雜的邏輯篩選和匹配提取信息

前言

pandas對文本數據也有很多便捷處理方法,可以不用寫循環(huán),向量化操作運算速度快,還可以進行高級的正則表達式,各種復雜的邏輯篩選和匹配提取信息。對于機器學習來說,從文本中做特征工程很是很有用的。

還是先導入包,讀取案例數據:

import numpy as np
import pandas as pd 
data = 'https://www.gairuo.com/file/data/dataset/team.xlsx'
df = pd.read_excel(data) 

文本數據類型

#object 和 StringDtype 是 Pandas 的兩個文本類型,不過作為新的數據類型,官方推薦 StringDtype 的使用。
#默認情況下,文本數據會被推斷為 object 類型。

pd.Series(['a', 'b', 'c'])

string 類型需要專門進行指定:

pd.Series(['a', 'b', 'c'], dtype="string")
pd.Series(['a', 'b', 'c'], dtype=pd.StringDtype())

?轉換,可以從其他類型轉換到這兩個類型:

s = pd.Series(['a', 'b', 'c'])
s.astype("object") # 轉換為 object
s.astype("string") # 轉換為 string
# 類型轉換,支持 string 類型
df.convert_dtypes().dtypes

推薦使用StringDtype類型取處理文本

字符操作

我們可以使用 .str.<method> 訪問器(Accessors)來對內容進行字符操作:

生成案例數據:

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

s.str.lower()# 轉為小寫

對于非字符類型我們可以先進行轉換,再使用

# 轉為 object
df.Q1.astype(str).str
# 轉為 StringDtype
df.team.astype("string").str
df.Q1.astype(str).astype("string").str

?.str后要展示數據要進行分割

#.str后要展示數據要進行分割
df.team.astype("string").str.strip()#等價于df.team.astype("string")

 對索引進行操作:

df.index.str.lower()
# 對表頭,列名進行操作
df.columns.str.lower()
df.columns.str.strip()     #相當于df.columns
#如果對數據連續(xù)進行字符操作,則每個操作都要使用 .str 方法:
df.columns.str.strip().str.lower().str.replace('q', '_')

文本格式

格式轉化:

#格式轉換
s = pd.Series(['lower', 'CAPITALS', 'this is a sentence', 'SwApCaSe'])
s.str.lower() # 轉為小寫
s.str.upper() # 轉為大寫
s.str.title() # 標題格式,每個單詞大寫
s.str.capitalize() # 首字母大寫
s.str.swapcase() # 大小寫互換
s.str.casefold() # 轉為小寫,支持其他語言如德語

文本對齊

類似字符串的格式化,可以填充或者對齊

# 居中對齊,寬度為10,用 - 填充
s.str.center(10, fillchar='-')
# 左對齊
s.str.ljust(10, fillchar='-')
# 右對齊
s.str.rjust(10, fillchar='-')

?指定寬度,填充內容對齊方式,填充內容

# side{‘left', ‘right', ‘both'}, default ‘left'
s.str.pad(width=10, side='left', fillchar='-')
# 填充對齊
s.str.zfill(10) # 生成字符,不足10位的前邊加0

?文本計數和編碼

# 指定字母的數量
s.str.count('a')
# 支持正則,包含 abc 三個字母的總數
s.str.count(r'a|b|c')
# 字符長度
s.str.len()

# 編碼
s.str.encode('utf-8')
# 解碼
s.str.decode('utf-8')
# 字符串的Unicode普通格式
# form{‘NFC', ‘NFKC', ‘NFD', ‘NFKD'}
s.str.normalize('NFC')

格式判斷

#類別判斷,以下方法可以判斷文本的相關格式:

# 檢查字母和數字字符
s.str.isalpha() # 是否純英文數字單詞組成
s.str.isalnum() # 是否單詞、數字或者它們組合形式組成

 請注意,對于字母數字檢查,針對混合了任何額外標點或空格的字符的檢查將計算為 False

s.str.isdecimal() # 是否數字 0-9 組成合規(guī)10進制數字
s.str.isdigit() # 同 但可識別 unicode中的上標和下標數字
s.str.isnumeric() # 是否可識別為一個數字,同 isdigit 可識別分數
s.str.isdecimal()  #是否為小數
 
s.str.isspace() # 是否空格
s.str.islower() # 是否小寫
s.str.isupper() # 是否大寫
s.str.istitle() # 是否標題格式,只有第一個字母大寫

 wrap將長文本拆分開指定寬度的字符,用換行連接 

s.str.wrap(10) 

文本高級處理

文本分割

#對內容中的下劃線進行了分隔,分隔后每個內容都成為了一個列表,其中對空值是不起作用的。
s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")
s2.str.split('_')

分隔后可以使用 get 或者 [] 來取出相應內容,不過 [] 是列表切片操作更加靈活,不僅可以取出單個內容,也可以取出多個內容組成的片斷。
取出每行第二個,列表索引從 0 開始

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

# get 只能傳一個值
s2.str.split('_').str.get(1)

# [] 可以使用切片操作
s2.str.split('_').str[1:3]
s2.str.split('_').str[:-2]
# 如果不指定分隔符,會按空格進行分隔
s2.str.split()
# 限制分隔的次數,從左開始,剩余的不分隔
s2.str.split(n=2)

 ##字符展開,使用 split 可以將分隔后的數據展開形成新的行內容。

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

 # 指定展開列數,n 為切片右值

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

#rsplit 和 split一樣,只不過它是從右邊開始分隔,如果沒有n參數,rsplit和split的輸出是相同的。 

s2.str.rsplit('_', expand=True, n=1)

 #使用正則,對于規(guī)則比較復雜的,分隔符處可以傳入正則表達式:

s = pd.Series(["1+1=2"])
s.str.split(r"\+|=", expand=True)

 文本切片選擇 slice

 #可以使用 .str.slice() 將指定的內容切除掉,不過還是推薦使用 s.str[]來實現,這樣和Python字符串列表操作是一樣的

s = pd.Series(["koala", "fox", "chameleon"])
s.str.slice() # 不做任何事
s.str.slice(1) # 切掉第一個字符
s.str.slice(start=1) #同上

 其他參數用法:

# 切除最后一個以前的,留下最后一個
s.str.slice(start=-1) # s.str[-1]
# 切除第二位以后的
s.str.slice(stop=2) # s.str[:2]
# 切除步長為2的內容
s.str.slice(step=2) # s.str[::2]
# 切除從開頭開始,第4位以后并且步長在3的內容
# 同 s.str[0:5:3]
s.str.slice(start=0, stop=5, step=3)

劃分 partition

#.str.partition可以將文本按分隔符號劃分為三個部分,形成一個新的 DataFrame或者相關數據類型。

s = pd.Series(['Linda van der Berg', 'George Pitt-Rivers'])
s.str.partition()

 其他:

# 從右開始劃分
s.str.rpartition()
# 指定符號
s.str.partition('-')
# 劃分為一個元組列
s.str.partition('-', expand=False)
# 對索引進行劃分
idx = pd.Index(['X 123', 'Y 999'])
idx.str.rpartition()      

文本替換

s = pd.Series(['12', '-$10', '$10,000'], dtype="string")
s.str.replace('$', '')

s.str.replace(r'$|,', '')#逗號也替換

 #如果我們替換 -$ 則發(fā)現不起作用,是因為替換字符默認是支持正則的(可以使用 regex=False 不支持),可以進行轉義來實現。

s.str.replace('-$', '') # 不起作用
s.str.replace(r'-\$', '-') # 進行轉義后正常

指定位置替換

#slice_replace 可以將保留選定內容,剩余內容進行替換:

s = pd.Series(['a', 'ab', 'abc', 'abdc', 'abcde'])
# 保留第一個,其他的替換或者追加 X
s.str.slice_replace(1, repl='X')

 # 指定位置前刪除并用 X 替換

s.str.slice_replace(stop=2, repl='X')

# 指定區(qū)間的內容被替換

s.str.slice_replace(start=1, stop=3, repl='X')

重復替換

# 對整體重復兩次
pd.Series(['a', 'b', 'c']).repeat(repeats=2)
# 對每個行內的內容重復兩次
pd.Series(['a', 'b', 'c']).str.repeat(repeats=2)
# 指定每行重復幾次
pd.Series(['a', 'b', 'c']).str.repeat(repeats=[1, 2, 3])

文本連接

#方法 s.str.cat 可以做文本連接的功能,下面介紹如何將序列的文本或者兩個文本序列連接在一起的方法。

#自身的連接
s = pd.Series(['a', 'b', 'c', 'd'], dtype="string")
s.str.cat(sep=',')
# 'a,b,c,d'
s.str.cat()

 對空值的處理:

t = pd.Series(['a', 'b', np.nan, 'd'], dtype="string")
t.str.cat(sep=',')
#'a,b,d'
t.str.cat(sep=',', na_rep='-')

 #指定列表序列連接

s.str.cat(['A', 'B', 'C', 'D'])

s.str.cat(t, na_rep='-')#空值處理

 當然我們也可以使用 pd.concat 來進行鏈接兩個序列:

d = pd.concat([t, s], axis=1)
'''
	0	1
0	a	a
1	b	b
2	<NA>	c
3	d	d'''
# 兩次連接
s.str.cat(d, na_rep='-')

文本連接的對齊方式:

u = pd.Series(['b', 'd', 'a', 'c'],
              index=[1, 3, 0, 2],
              dtype="string")
# 以左邊索的為主
s.str.cat(u)
s.str.cat(u, join='left')
# 以右邊的索引為主
s.str.cat(u, join='right')
# 其他
s.str.cat(t, join='outer', na_rep='-')
s.str.cat(t, join='inner', na_rep='-')

文本查詢

#查詢 findall

s = pd.Series(['Lion', 'Monkey', 'Rabbit'])
s.str.findall('Monkey')
'''
0          []
1    [Monkey]
2          []
dtype: object
'''
# 大小寫敏感,不會查出內容
s.str.findall('MONKEY')

s.str.findall('on')   #包含on

#利用正則查詢和給定文本相同的內容:

# 忽略大小寫
import re
s.str.findall('MONKEY', flags=re.IGNORECASE)
# 以 on 結尾
s.str.findall('on$')
# 包含多個的會形成一個列表
s.str.findall('b')

#可以使用str.find匹配返回匹配結果的位置(從0開始),-1為不匹配:

s.str.find('Monkey')

s1 = pd.Series(['Mouse', 'dog', 'house and parrot', '23', np.NaN])
s1.str.contains('og', regex=False)

文本包含

#包含 contains
#判斷字符是否有包含關系,經常用在數據篩選中。它默認是支持正則的,如果不需要可以關掉。na=nan 可以指定

s1 = pd.Series(['Mouse', 'dog', 'house and parrot', '23', np.NaN])
s1.str.contains('og', regex=False)

 #可以用在數據查詢篩選中:

# 名字包含 A 字母
df.loc[df.name.str.contains('A')]
# 包含 A 或者 C
df.loc[df.name.str.contains('A|C')]
# 忽略大小寫
import re
df.loc[df.name.str.contains('A|C', flags=re.IGNORECASE)]
# 包含數字
df.loc[df.name.str.contains('\d')]

 另外,.str.startswith 和 .str.endswith 還可以指定開頭還是結尾包含:

s = pd.Series(['bat', 'Bear', 'cat', np.nan])
s.str.startswith('b')
# 對空值的處理
s.str.startswith('b', na=False)
s.str.endswith('t')
s.str.endswith('t', na=False)

文本匹配

#匹配 match,確定每個字符串是否與正則表達式匹配。
pd.Series(['1', '2', '3a', '3b', '03c'], dtype="string").str.match(r'[0-9][a-z]')

文本提取

#提取 extract, .str.extract 可以利用正則將文本中的數據提取出來形成單獨的列,下列中正則將文本分為兩部分,
#第一部分匹配 ab 三個字母,第二位匹配數字,最終得這兩列,c3 由于無法匹配,最終得到兩列空值。

s=pd.Series(['a1', 'b2', 'c3'],dtype="string")
s.str .extract(r'([ab])(\d)', expand=True)

 #expand 參數如果為真則返回一個 DataFrame,不管是一列還是多列,為假時只有一列時才會返回一個 Series/Index。

s.str.extract(r'([ab])?(\d)')

#3是數值,匹配上了

# 取正則組的命名為列名
s.str.extract(r'(?P<letter>[ab])(?P<digit>\d)')

 #匹配全部,會將一個文本中所有符合規(guī)則的匹配出來,最終形成一個多層索引數據:

s = pd.Series(["a1a2", "b1b7", "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 = pd.Series(['a', 'a|b', np.nan, 'a|c'], dtype="string")
s.str.get_dummies(sep='|')

 #也可以對索引進行這種操作:

idx = pd.Index(['a', 'a|b', np.nan, 'a|c'])
idx.str.get_dummies(sep='|')

到此這篇關于Pandas數據分析之pandas文本處理的文章就介紹到這了,更多相關 pandas文本處理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用Python開發(fā)游戲運行腳本實現模擬點擊

    使用Python開發(fā)游戲運行腳本實現模擬點擊

    這篇文章主要介紹了使用Python開發(fā)游戲運行腳本實現模擬點擊,這樣我們要想實現手游腳本開發(fā)的第一步,就是下載Android模擬器,然后在對安卓模擬器進行鼠標和鍵盤的模擬,以此來實現自動化游戲腳本,需要的朋友可以參考下
    2021-11-11
  • 從零開始學Python第八周:詳解網絡編程基礎(socket)

    從零開始學Python第八周:詳解網絡編程基礎(socket)

    本篇文章主要介紹了從零開始學Python第八周:詳解網絡編程基礎(socket) ,具有一定的參考價值,有興趣的可以了解一下。
    2016-12-12
  • Python使用openpyxl復制整張sheet

    Python使用openpyxl復制整張sheet

    這篇文章主要介紹了Python使用openpyxl復制整張sheet,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Pandas數據處理庫畫圖與文件讀取使用示例

    Pandas數據處理庫畫圖與文件讀取使用示例

    這篇文章主要為大家介紹了Pandas數據處理庫畫圖與文件讀取使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 用Python實現一個簡單的線程池

    用Python實現一個簡單的線程池

    這篇文章主要介紹了用Python實現一個簡單的線程池,通過這個小程序可以幫助更好地理解Python中線程的運行機制,需要的朋友可以參考下
    2015-04-04
  • python tkinter 設置窗口大小不可縮放實例

    python tkinter 設置窗口大小不可縮放實例

    這篇文章主要介紹了python tkinter 設置窗口大小不可縮放實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python去除所有html標簽的方法

    python去除所有html標簽的方法

    這篇文章主要介紹了python去除所有html標簽的方法,涉及Python正則替換的相關技巧,非常簡單實用,需要的朋友可以參考下
    2015-05-05
  • python實現班級檔案管理系統(tǒng)

    python實現班級檔案管理系統(tǒng)

    這篇文章主要為大家詳細介紹了python實現班級檔案管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • python中的np.argmax() 返回最大值索引號

    python中的np.argmax() 返回最大值索引號

    這篇文章主要介紹了python中的np.argmax() 返回最大值索引號操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • python中waitKey實例用法講解

    python中waitKey實例用法講解

    在本篇文章里小編給大家整理了一篇關于python中waitKey實例用法講解,有興趣的朋友們可以參考學習下。
    2021-04-04

最新評論