<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
pandas對文字資料也有很多便捷處理方法,可以不用寫回圈,向量化操作運算速度快,還可以進行高階的正規表示式,各種複雜的邏輯篩選和匹配提取資訊。對於機器學習來說,從文字中做特徵工程很是很有用的。
還是先匯入包,讀取案例資料:
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 #如果對資料連續進行字元操作,則每個操作都要使用 .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 組成合規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)
#使用正則,對於規則比較複雜的,分隔符處可以傳入正規表示式:
s = pd.Series(["1+1=2"]) s.str.split(r"+|=", expand=True)
#可以使用 .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)
#.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'$|,', '')#逗號也替換
#如果我們替換 -$ 則發現不起作用,是因為替換字元預設是支援正則的(可以使用 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')
# 指定區間的內容被替換
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)')
#匹配全部,會將一個文字中所有符合規則的匹配出來,最終形成一個多層索引資料:
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文書處理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45