python庫--pandas--Series.str--字符串處理

原數據

import pandas as pd
a = pd.Series(['aSd', 'asd', 'dfd fsAsf sfs'])
b = pd.Series([None, 'asd', 'fgh'])
index a b
0 aSd None
1 asd asd
2 dfd fsAsf sfs fgh

字符大小寫轉換

a.str.lower()
a.str.upper()
a.str.title()
a.str.capitalize()
a.str.swapcase()
lower upper title capitalize swapcase
0 asd ASD Asd Asd AsD
1 asd ASD Asd Asd ASD
2 dfd fsasf sfs DFD FSASF SFS Dfd Fsasf Sfs Dfd fsasf sfs DFD FSaSF SFS

字符串拼接

自身拼接

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

aSd,asd,dfd fsAsf sfsgit

與其它series拼接

a.str.cat(a)
a.str.cat(['aSd', 'asd', 'dfd fsAsf sfs'])
a + a
index value
0 aSdaSd
1 asdasd
2 dfd fsAsf sfsdfd fsAsf sfs
a.str.cat(a, sep=',')
a.str.cat(['aSd', 'asd', 'dfd fsAsf sfs'], sep=',')
a + ',' + a
index value
0 aSd,aSd
1 asd,asd
2 dfd fsAsf sfs,dfd fsAsf sfs

數據含有None/NaN的狀況

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

asd,fgh正則表達式

# 將NaN替換爲指定字符串進行操做
a.str.cat(sep=',', na_rep='???')

???,asd,fghapi

  • 剩下的狀況除將NaN替換爲指定字符以外跟上述示例同樣, 這裏再也不進行演示

字符填充/插入/擴展

# 向兩端填充指定字符到指定長度
a.str.center(width=10, fillchar='?')
a.str.pad(width=10, side='both', fillchar='?')
# 在右側填充指定字符到指定長度
a.str.ljust(width=10, fillchar='?')
a.str.pad(width=10, side='right', fillchar='?')
# 在右側填充指定字符到指定長度
a.str.rjust(width=10, fillchar='?')
a.str.pad(width=10, side='left', fillchar='?')
center ljust rjust
0 ???aSd???? aSd??????? ???????aSd
1 ???asd???? asd??????? ???????asd
2 dfd fsAsf sfs dfd fsAsf sfs dfd fsAsf sfs
# 每隔指定個字符插入一個換行符
a.str.wrap(width=2)
# 在字符串前面填充0到指定長度
a.str.zfill(width=10)
# 將字符串擴展n倍
a.str.repeat(repeats=2)
# 爲每個元素指定擴展倍數
a.str.repeat(repeats=[2, 2, 2])
wrap zfill repeat
0 aS\nd 0000000aSd aSdaSd
1 as\nd 0000000asd asdasd
2 df\nd \nfs\nAs\nf \nsf\ns dfd fsAsf sfs dfd fsAsf sfsdfd fsAsf sfs
  • join() 在字符間插入字符
a.str.join(sep='?')
# 等同於
a.map(lambda x: '?'.join(x))
  • 所以也出現了一種特殊狀況, 元素不是字符串但可使用join方法
  • 通過不徹底證實, '?'.join() 中支持的參數做爲Series的元素是均可使用此方法
pd.Series([['1', '2', '3']]).join('?')

字符串內容判斷

如下方法返回由True和False組成的Serieside

  • contains(): 判斷指定字符串或正則表達式是否在序列或索引中
參數 說明
pat 字符串或正則表達式
case=True 是否區分大小寫
flags=0 可傳入re.IGNORECASE之類的參數
na=nan 缺失值填充
regex=True 是否使用正則表達式匹配
  • endswith(): 判斷是否以給定的字符串結尾
參數 說明
pat 字符串
na=nan 缺失值填充
  • match(): 判斷是否以給定的字符串開頭(支持正則)
參數 說明
pat 字符串或正則表達式
case=True 是否區分大小寫
flags=0 可傳入re.IGNORECASE之類的參數
na=nan 缺失值填充
as_indexer=None 棄用
方法 說明
.isalnum() 字符串至少包含一個字符且全部字符都是字母(漢字)或數字則返回True
.isalpha() 字符串至少包含一個字符且全部字符都是字母(漢字)則返回True
.isdigit() 只包含數字(能夠是: Unicode, 全角字符, bytes(b'1'), 羅馬數字)
.isspace() 只包含空白符
.islower() 至少包含一個小寫字符, 且不包含大寫字符
.isupper() 至少包含一個大寫字符, 且不包含小寫字符
.istitle() 全部單詞大寫開頭其他小寫(標題化)
.isnumeric() 只包含數字字符
.isdecimal() 只包含數字(Unicode字符, 全角字符)

查找

  • extract(): 使用正則表達式提取須要的內容(只返回第一次匹配到的內容)
  • extractall(): 使用正則表達式提取須要的內容(返回全部匹配到的內容
參數 說明
pat 正則表達式(必須含有捕獲組, 超過一個必然返回DataFrame)
若捕獲組設有name則將做爲返回的列標籤
flags=0 可傳入re.IGNORECASE之類的參數
expand=None True: 返回DataFrame(將來版本默認值)
False: 返回S/I/DataFrame(如今版本默認值)
extractall() 方法無此參數
a.str.extract('([A-Z]+)')
a.str.extract('([A-Z]+)(s*)')
([A-Z]+) - ([A-Z]+)(s*)
0 S - S
1 NaN - NaN  NaN
2 A - A    s
a.str.extractall('(?P<field1>[sSdf]+)(?P<field2>[ds])')
field1 field2 說明
match
0 0 S d 第1行第1個匹配結果
1 0 s d 第2行第1個匹配結果
2 0 df d 第3行第1個匹配結果
1 f s 第3行第2個匹配結果
2 sf s 第3行第3個匹配結果
  • 檢索sub在字符串中的位置, 能夠指的那個開始檢索和結束檢索的位置
    1. find(): 檢索不到返回-1
    2. rfind(): 從右往左檢索, 檢索不到返回-1
    3. index(): 檢索不到觸發異常
    4. rindex(): 從右往左檢索, 檢索不到返回-1
a.str.find(sub='s')
# 從第6個字符開始查找到第10個字符結束查找
a.str.find(sub='s', start=6, end=10)
(sub='s') (sub='s', start=6, end=10)
0 -1 -1
1 1 -1
2 5 7
  • findall(): 以列表形式返回正則表達式全部匹配結果
a.str.findall(pat='[sSdf]+')
a.map(lambda x: re.findall('[sSdf]+', x))
結果
0 [Sd]
1 [sd]
2 [dfd, fs, sf, sfs]
  • get(): 獲取指定位置的字符
a.str.get(i=1)
結果
0 S
1 s
2 f

統計

  • count() 統計指定字符串(支持正則)在序列字符串中出現的次數
  • len() 返回序列字符串的長度
a.str.count(pat='s', flags=0)
a.str.len()
count len
0 0 3
1 1 3
2 4 13

轉碼

  • encode(): 編碼str --> bytes
  • decode(): 解碼bytes --> str
參數 說明
encoding 編碼方式
error='static' static: 編碼/解碼失敗拋出異常

ignore: 編碼/解碼失敗自動忽略非法字符

replace: 編碼/解碼失敗則使用 ? 替代非法字符

xmlcharrefreplace: 則引用XML的字符.編碼

c = pd.Series(['中文', '\ud83easd'])
c.str.encode('utf8', 'ignore')
c.str.encode('utf8', 'replace')
c.str.encode('utf8', 'xmlcharrefreplace')
ignore replace xmlcharrefreplace backslashreplace
1 b'asd' b'?asd' b'&#55358;asd' b'\ud83easd'
# 中國: b'\xe4\xb8\xad\xe6\x96\x87'
d = pd.Series([b'\xe4\xb8\xad\xe6\x96'])
d.str.decode('utf8', 'ignore')
ignore replace xmlcharrefreplace backslashreplace
1 中� NaN 中\xe6\x96
  • normalize(): 返回字符串的Unicode標準格式

刪減/截取

  • strip(to_strip=None): 刪除兩側指定字符, 默認刪除空白符
  • lstrip(to_strip=None): 刪除左側指定字符, 默認刪除空白符
  • rstrip(to_strip=None): 刪除右側指定字符, 默認刪除空白符
  • slice() 截取子字符串
參數 說明
start=None 開始位置
stop=None 結束位置
step=None 步長

分割/替換

  • split() 使用指定字符分割字符串, 支持正則
  • rsplit() 從右側開始分割
參數 說明
pat=None 分隔符, 默認空白符
n=-1 分割次數, 默認所有
expand=False True: 返回DataFrame/MultiINdex
False: 返回Series/Index
  • get_dummies(): 對字符串分割, 並返回每一個分割結果出現的次數
>>> pd.Series(['a|b', 'a', 'a|c']).str.get_dummies()
   a  b  c
0  1  1  0
1  1  0  0
2  1  0  1
>>> pd.Series(['a|b', np.nan, 'a|c']).str.get_dummies()
   a  b  c
0  1  1  0
1  0  0  0
2  1  0  1
  • partition(pat='', expand=True): 第一次出現pat時將字符串分割爲三個部分: pat前面的部分, pat自己, pat後面的部分
  • rpartition(): 從右往左檢測pat字符串

更新字符串

  • replace(): 更新字符串
參數 說明
pat 字符串或編譯的正則表達式
repl str: 將匹配到的字符串替換爲此字符串
fun: 傳給fun的是對象至關於re.search(pat, string)的返回值
n=-1 替換的次數, 默認所有
case=None 是否區分大小寫, 若是pat爲字符串則默認爲True, 若爲編譯的正則表達式則不能設置
flags=0 可傳入re.IGNORECASE之類的參數, 但若pat爲編譯的正則表達式則不能設置
  • slice_replace(): 將選中的部分替換爲指定字符串
參數 說明
start=None 開始位置
stop=None 結束位置
repl=None 要替換爲的字符串
  • translate(): 字符替換
    1. dict: {ord('a'): 'x'} 或 {ord('a'): ord('x')} key必須是ascii碼, value能夠是字符串或ASCII碼
    2. str.maketrans('a','x') 等同於 {97: 120}
相關文章
相關標籤/搜索