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