[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数据科学手册》

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