目錄
- 原數據
- 字符大小寫轉換
- 字符串拼接
- 字符填充/插入/擴展
- 字符串內容判斷
- 查找
- 統計
- 轉碼
- 刪減/截取
- 分割/替換
原數據
import pandas as pd
a = pd.Series(['aSd', 'asd', 'dfd fsAsf sfs'])
b = pd.Series([None, 'asd', 'fgh'])
| 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()
| 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 sfs
與其它series拼接
a.str.cat(a)
a.str.cat(['aSd', 'asd', 'dfd fsAsf sfs'])
a + a
| 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
| 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,fgh
- 剩下的情況除將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='?')
| 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])
| 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 |
a.str.join(sep='?')
# 等同于
a.map(lambda x: '?'.join(x))
- 因此也出現了一種特殊情況, 元素不是字符串但可以使用join方法
- 經過不完全證明, '?'.join() 中支持的參數作為Series的元素是都可使用此方法
pd.Series([['1', '2', '3']]).join('?')
字符串內容判斷
以下方法返回由True和False組成的Series
- contains(): 判斷指定字符串或正則表達式是否在序列或索引中
| pat | 字符串或正則表達式 |
| case=True | 是否區分大小寫 |
| flags=0 | 可傳入re.IGNORECASE之類的參數 |
| na=nan | 缺失值填充 |
| regex=True | 是否使用正則表達式匹配 |
- endswith(): 判斷是否以給定的字符串結尾
- 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*)')
| 0 | S | - | S |
| 1 | NaN | - | NaN ?NaN |
| 2 | A | - | A ?? s |
a.str.extractall('(?P<field1>[sSdf]+)(?P<field2>[ds])')
| ? | 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在字符串中的位置, 可以指的那個開始檢索和結束檢索的位置
- find(): 檢索不到返回-1
- rfind(): 從右往左檢索, 檢索不到返回-1
- index(): 檢索不到觸發異常
- rindex(): 從右往左檢索, 檢索不到返回-1
a.str.find(sub='s')
# 從第6個字符開始查找到第10個字符結束查找
a.str.find(sub='s', start=6, end=10)
- findall(): 以列表形式返回正則表達式所有匹配結果
a.str.findall(pat='[sSdf]+')
a.map(lambda x: re.findall('[sSdf]+', x))
| 0 | [Sd] |
| 1 | [sd] |
| 2 | [dfd, fs, sf, sfs] |
a.str.get(i=1)
統計
- count() 統計指定字符串(支持正則)在序列字符串中出現的次數
- len() 返回序列字符串的長度
a.str.count(pat='s', flags=0)
a.str.len()
轉碼
- 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')
| 1 | b'asd' | b'?asd' | b'�asd' | b'\ud83easd' |
# 中國: b'\xe4\xb8\xad\xe6\x96\x87'
d = pd.Series([b'\xe4\xb8\xad\xe6\x96'])
d.str.decode('utf8', 'ignore')
- 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字符串
更新字符串
| 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(): 字符替換
- dict: {ord('a'): 'x'} 或 {ord('a'): ord('x')} key必須是ascii碼, value可以是字符串或ASCII碼
- str.maketrans('a','x') 等同于 {97: 120}
轉載于:https://www.cnblogs.com/P--K/p/11148250.html
總結
以上是生活随笔為你收集整理的python库--pandas--Series.str--字符串处理的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。