[ Pandas version: 1.0.1 ]
十、向量化字符串操作
Pandas提供一系列向量化字符串操作(vectorized string operation)是在處理(清洗)現實工作中的數據時不可或缺的功能。
Pandas字符串方法列表
1. 與Python字符串方法相似的方法
返回字符串Series[Series or Index of object]:
方法 | 參數 | 描述 |
---|---|---|
lower() |
NA | 全部小寫 |
upper() |
NA | 全部大寫 |
capitalize() |
NA | 首字母大寫 |
swapcase() |
NA | 大小寫互換 |
ljust() |
width[int], fillchar=’ '[str] |
返回一個原字符串左對齊,並使用空格填充至指定長度的新字符串。 如果指定的長度小於原字符串的長度則返回原字符串 |
rjust() |
width, fillchar=’ ’ |
返回一個原字符串右對齊,並使用空格填充至指定長度的新字符串。 如果指定的長度小於原字符串的長度則返回原字符串 |
center() |
width, fillchar=’ ’ |
返回一個原字符串居中,並使用空格填充至長度width的新字符串 |
zfill() |
width[int] | 返回指定長度的字符串,原字符串右對齊,前面填充0 |
index() |
sub[str], start=0[int-index], end=None[index] |
查找給定字符串的位置,注意,如果不存在這個字符串,那麼會報錯 |
rindex() |
sub[str], start=0[int-index], end=None[index] |
從右邊開始查找,給定字符串的位置 |
strip() |
to_strip=None[str or None] | 去除兩邊的空白字符 |
rstrip() |
to_strip=None[str or None] | 去除右邊的空白字符 |
lstrip() |
to_strip=None[str or None] | 去除左邊的空白字符 |
返回布爾值[Series or Index of bool]:
方法 | 參數 | 描述 |
---|---|---|
islower() |
NA | 是否全部小寫 |
isupper() |
NA | 是否全部大寫 |
isspace() |
NA | 是否全部是空格 |
istitle() |
NA | 是否首字母大寫 |
isnumeric() |
NA | 是否全部是數字 |
isdigit() |
NA | 是否全部都是數字並至少有一個字符 |
isdecimal() |
NA | 檢查字符串是否只包含十進制字符 |
isalpha() |
NA | 是否全部是字母 |
isalnum() |
NA | 是否全部是數字和字母組成 |
startswith() |
pat[str], na=nan[object] |
判斷是否以給定的字符串開頭 |
endswith() |
pat[str], na=nan[object] |
判斷是否以給定的字符串結束 |
返回數值[Series or Index of int]:
方法 | 參數 | 描述 |
---|---|---|
len() |
NA | 計算每個元素的長度 |
find() |
sub[str], start=0[int-index], end=None[index] |
從左邊開始,查找給定字符串的所在位置 |
rfind() |
sub[str], start=0[int-index], end=None[index] |
從右邊開始,查找給定字符串的所在位置 |
返回列表或其他複合值:
方法 | 參數 | 返回值 | 描述 |
---|---|---|---|
partition() |
sep=’ '[str], expand=True[bool] |
DataFrame/MultiIndex or Series/Index of objects | 把字符串數組切割爲DataFrame, 切割爲三部分,分隔符前,分隔符,分隔符後 |
rpartition() |
sep=’ ', expand=True |
DataFrame/MultiIndex or Series/Index of objects | 從右切割 |
split() |
pat=None[str, optional], n=-1[int], expand=False[bool-separate columns- True=DataFrame, False=Series/Index] |
Series, Index, DataFrame or MultiIndex | 切分字符串 |
rsplit() |
pat=None[str, optional], n=-1[int], expand=False[bool] |
Series, Index, DataFrame or MultiIndex | 從右切分 |
translate() |
table[dict] | Series or Index | 返回原字符串的副本, 其中每個字符按給定的轉換表進行映射 |
import pandas as pd
monte = pd.Series(['Graham Chapman', 'John Cleese',
'Terry Gilliam', 'Eric Idle', 'Terry Jones', 'Michael Palin'])
monte
# 0 Graham Chapman
# 1 John Cleese
# 2 Terry Gilliam
# 3 Eric Idle
# 4 Terry Jones
# 5 Michael Palin
# dtype: object
monte.str.lower()
# 0 graham chapman
# 1 john cleese
# 2 terry gilliam
# 3 eric idle
# 4 terry jones
# 5 michael palin
# dtype: object
monte.str.len()
# 0 14
# 1 11
# 2 13
# 3 9
# 4 11
# 5 13
# dtype: int64
monte.str.startswith('T')
# 0 False
# 1 False
# 2 True
# 3 False
# 4 True
# 5 False
# dtype: bool
monte.str.split()
# 0 [Graham, Chapman]
# 1 [John, Cleese]
# 2 [Terry, Gilliam]
# 3 [Eric, Idle]
# 4 [Terry, Jones]
# 5 [Michael, Palin]
# dtype: object
2. 使用正則表達式的方法
Pandas向量化字符串方法與Python標準庫的re模塊函數的對應關係
方法 | 描述 |
---|---|
match() |
對每個元素調用re.match(),返回布爾類型值 |
extract() |
對每個元素調用re.match(),返回匹配的字符串組(groups) |
findall() |
對每個元素調用re.findall() |
replace() |
用正則模式替換字符串 |
contains() |
對每個元素調用re.search(),返回布爾類型值 |
count() |
計算符合正則模式的字符串的數量 |
split() |
等價於str.split(),支持正則表達式 |
rsplit() |
等價於str.rsplit(),支持正則表達式 |
# 提取元素前面的連續字母作爲每個人的first name
monte.str.extract('([A-Za-z]+)')
# 0
# 0 Graham
# 1 John
# 2 Terry
# 3 Eric
# 4 Terry
# 5 Michael
# 找出所有開頭和結尾都是輔音字母的名字
# 正則表達式:開始符號(^),結尾符號($)
monte.str.findall(r'^[^AEIOU].*[^aeiou]$')
# 0 [Graham Chapman]
# 1 []
# 2 [Terry Gilliam]
# 3 []
# 4 [Terry Jones]
# 5 [Michael Palin]
# dtype: object
3. 其他字符串方法
方法 | 描述 |
---|---|
get() |
獲取元素索引位置上的值,索引從0開始 |
slice() |
對元素進行切片取值 |
slice_replace() |
對元素進行切片替換 |
cat() |
連接字符串 |
repeat() |
重複元素 |
normalize() |
將字符串轉換爲Unicode規範形式 |
pad() |
在字符串的左邊、右邊或兩邊增加空格 |
wrap() |
在字符串按照指定的寬度換行 |
join() |
用分隔符連接Series的每個元素 |
get_dummies() |
按照分隔符提取每個元素的dummy變量,轉換爲獨熱(one-hot)編碼的DataFrame |
(1) 向量化字符串的取值與切片操作:
get()與slice()可以從每個字符串數組中獲取向量化元素,通過Python的標準化取值方法也可以取得同樣的效果。
df.str.slice(0, 3)
等價於df.str[0:3]
df.str.get(i)
等價於df.str[i]
# 取每個字符串數組的前三個字符
monte.str[0:3]
# 0 Gra
# 1 Joh
# 2 Ter
# 3 Eri
# 4 Ter
# 5 Mic
# dtype: object
# 獲取每個姓名的last name
monte.str.split().str.get(-1)
# 0 Chapman
# 1 Cleese
# 2 Gilliam
# 3 Idle
# 4 Jones
# 5 Palin
# dtype: object
(2) 指標變量
get_dummies()
方法:當數據有一列包含了若干已被編碼的指標(code indicator)時適用,可以快速將指標變量分割成一個獨熱編碼的DataFrame(每個元素都是0或1)
# 包含某種編碼信息的數據集
# A=出生在美國,B=出生在英國,C=喜歡奶酪,D=喜歡午餐肉
full_monte = pd.DataFrame({'name': monte,
'info': ['B|C|D', 'B|D', 'A|C', 'B|D', 'B|C', 'B|C|D']})
full_monte
# name info
# 0 Graham Chapman B|C|D
# 1 John Cleese B|D
# 2 Terry Gilliam A|C
# 3 Eric Idle B|D
# 4 Terry Jones B|C
# 5 Michael Palin B|C|D
full_monte['info'].str.get_dummies('|')
# A B C D
# 0 0 1 1 1
# 1 0 1 0 1
# 2 1 0 1 0
# 3 0 1 0 1
# 4 0 1 1 0
# 5 0 1 1 1
Pandas 相關閱讀:
[Python3] Pandas v1.0 —— (一) 對象、數據取值與運算
[Python3] Pandas v1.0 —— (二) 處理缺失值
[Python3] Pandas v1.0 —— (三) 層級索引
[Python3] Pandas v1.0 —— (四) 合併數據集
[Python3] Pandas v1.0 —— (五) 累計與分組
[Python3] Pandas v1.0 —— (六) 數據透視表
[Python3] Pandas v1.0 —— (七) 向量化字符串操作 【本文】
[Python3] Pandas v1.0 —— (八) 處理時間序列
[Python3] Pandas v1.0 —— (九) 高性能Pandas: eval()與query()
總結自《Python數據科學手冊》