python库--pandas--Series.str--字符串处理

1. 原数据

import pandas as pd
a = pd.Series(['aSd', 'asd', 'dfd fsAsf sfs'])
b = pd.Series([None, 'asd', 'fgh'])
indexab
0aSdNone
1asdasd
2dfd fsAsf sfsfgh

2. 字符大小写转换

a.str.lower()
a.str.upper()
a.str.title()
a.str.capitalize()
a.str.swapcase()
loweruppertitlecapitalizeswapcase
0asdASDAsdAsdAsD
1asdASDAsdAsdASD
2dfd fsasf sfsDFD FSASF SFSDfd Fsasf SfsDfd fsasf sfsDFD FSaSF SFS

3. 字符串拼接

3.1 自身拼接

a.str.cat(sep=',')

aSd,asd,dfd fsAsf sfs

3.2 与其它series拼接

a.str.cat(a)
a.str.cat(['aSd', 'asd', 'dfd fsAsf sfs'])
a + a
indexvalue
0aSdaSd
1asdasd
2dfd fsAsf sfsdfd fsAsf sfs
a.str.cat(a, sep=',')
a.str.cat(['aSd', 'asd', 'dfd fsAsf sfs'], sep=',')
a + ',' + a
indexvalue
0aSd,aSd
1asd,asd
2dfd fsAsf sfs,dfd fsAsf sfs

3.3 数据含有None/NaN的情况

b.str.cat(sep=',')

asd,fgh

# 将NaN替换为指定字符串进行操作
a.str.cat(sep=',', na_rep='???')

???,asd,fgh

  • 剩下的情况除将NaN替换为指定字符之外跟上述示例一样, 这里不再进行演示

4. 字符填充/插入/扩展

# 向两端填充指定字符到指定长度
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='?')
centerljustrjust
0???aSd???aSd??????aSd
1???asd???asd??????asd
2dfd fsAsf sfsdfd fsAsf sfsdfd 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])
wrapzfillrepeat
0aS\nd0000000aSdaSdaSd
1as\nd0000000asdasdasd
2df\nd \nfs\nAs\nf \nsf\nsdfd fsAsf sfsdfd fsAsf sfsdfd fsAsf sfs
  • join() 在字符间插入字符
a.str.join(sep='?')
# 等同于
a.map(lambda x: '?'.join(x))
  • 因此也出现了一种特殊情况, 元素不是字符串但可以使用join方法
  • 经过不完全证明, ‘?’.join() 中支持的参数作为Series的元素是都可使用此方法
pd.Series([['1', '2', '3']]).join('?')

5. 字符串内容判断

以下方法返回由True和False组成的Series

  • contains(): 判断指定字符串或正则表达式是否在序列或索引中
参数说明
pat字符串或正则表达式
case=True是否区分大小写
flags=0可传入re.IGNORECASE之类的参数
na=nan缺失值填充
regex=True是否使用正则表达式匹配
  • endswith(): 判断是否以给定的字符串结尾
参数说明
pat字符串
na=nan缺失值填充
  • 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字符, 全角字符)

6. 查找

  • extract(): 使用正则表达式提取需要的内容(只返回第一次匹配到的内容)
  • extractall(): 使用正则表达式提取需要的内容(返回所有匹配到的内容
参数说明
pat正则表达式(必须含有捕获组, 超过一个必然返回DataFrame)
若捕获组设有name则将作为返回的列标签
flags=0可传入re.IGNORECASE之类的参数
expand=NoneTrue: 返回DataFrame(未来版本默认值)
False: 返回S/I/DataFrame(现在版本默认值)
extractall() 方法无此参数
a.str.extract('([A-Z]+)')
a.str.extract('([A-Z]+)(s*)')
([A-Z]+)-([A-Z]+)(s*)
0S-S
1NaN-NaN  NaN
2A-A    s
a.str.extractall('(?P<field1>[sSdf]+)(?P<field2>[ds])')
field1field2说明
match
00Sd第1行第1个匹配结果
10sd第2行第1个匹配结果
20dfd第3行第1个匹配结果
1fs第3行第2个匹配结果
2sfs第3行第3个匹配结果
  • 检索sub在字符串中的位置, 可以指的那个开始检索和结束检索的位置
    1. find(): 检索不到返回-1
    2. rfind(): 从右往左检索, 检索不到返回-1
    3. index(): 检索不到触发异常
    4. rindex(): 从右往左检索, 检索不到返回-1
a.str.find(sub='s')
# 从第6个字符开始查找到第10个字符结束查找
a.str.find(sub='s', start=6, end=10)
(sub=‘s’)(sub=‘s’, start=6, end=10)
0-1-1
11-1
257
  • findall(): 以列表形式返回正则表达式所有匹配结果
a.str.findall(pat='[sSdf]+')
a.map(lambda x: re.findall('[sSdf]+', x))
结果
0[Sd]
1[sd]
2[dfd, fs, sf, sfs]
  • get(): 获取指定位置的字符
a.str.get(i=1)
结果
0S
1s
2f

7. 统计

  • count() 统计指定字符串(支持正则)在序列字符串中出现的次数
  • len() 返回序列字符串的长度
a.str.count(pat='s', flags=0)
a.str.len()
countlen
003
113
2413

8. 转码

  • 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')
ignorereplacexmlcharrefreplacebackslashreplace
1b’asd’b’?asd’b’&#55358;asd’b’\ud83easd’
# 中国: b'\xe4\xb8\xad\xe6\x96\x87'
d = pd.Series([b'\xe4\xb8\xad\xe6\x96'])
d.str.decode('utf8', 'ignore')
ignorereplacexmlcharrefreplacebackslashreplace
1中�NaN中\xe6\x96
  • normalize(): 返回字符串的Unicode标准格式

9. 删减/截取

  • strip(to_strip=None): 删除两侧指定字符, 默认删除空白符
  • lstrip(to_strip=None): 删除左侧指定字符, 默认删除空白符
  • rstrip(to_strip=None): 删除右侧指定字符, 默认删除空白符
  • slice() 截取子字符串
参数说明
start=None开始位置
stop=None结束位置
step=None步长

10. 分割/替换

10.1 分割字符串

  • split() 使用指定字符分割字符串, 支持正则
  • rsplit() 从右侧开始分割
参数说明
pat=None分隔符, 默认空白符
n=-1分割次数, 默认全部
expand=FalseTrue: 返回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字符串

10.2 替换字符串

  • replace(): 更新字符串
参数说明
pat字符串或编译的正则表达式
replstr: 将匹配到的字符串替换为此字符串
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(): 字符替换
    1. dict: {ord(‘a’): ‘x’} 或 {ord(‘a’): ord(‘x’)} key必须是ascii码, value可以是字符串或ASCII码
    2. str.maketrans(‘a’,‘x’) 等同于 {97: 120}
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值