[Python3] Pandas v1.0 —— (七) 向量化字符串操作


[ 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數據科學手冊》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章