一.大小写转换
1.转换全部字母:
将所有字母转换为小写:<Ss>.lower()
将所有字母转换为大写:<Ss>.upper()
#参数说明:
Ss:指定pandas.core.strings.StringMethods object,可通过<S>.str得到
#实例:
>>> s=pd.Series(["ASjkdS","dKDsd","jksdAA"])
>>> s.str.lower()
0 asjkds
1 dkdsd
2 jksdaa
dtype: object
>>> s.str.upper()
0 ASJKDS
1 DKDSD
2 JKSDAA
dtype: object
2.转换单词首字母:
按标题的格式转换:<Ss>.title()
#即所有单词(通过空格分割)的首字母均大写,其他字母均为小写
#实例:
>>> s=pd.Series(["ASjkdS asASk","dKDsd JDj","jksdAA sJSDK"])
>>> s.str.title()
0 Asjkds Asask
1 Dkdsd Jdj
2 Jksdaa Sjsdk
dtype: object
3.转换首字母:
将字符串的首字母转换为大写:<Ss>.capitalize()
#实例:接上
>>> s.str.capitalize()
0 Asjkds asask
1 Dkdsd jdj
2 Jksdaa sjsdk
dtype: object
4.互相转换:
是字母的大小写互相转换:<Ss>.swapcase()
#即小写字母转换为大写,大写字母转换为小写
#实例:接上
>>> s.str.swapcase()
0 asJKDs ASasK
1 DkdSD jdJ
2 JKSDaa Sjsdk
dtype: object
二.拼接与分割
1.拼接:
拼接字符串:<Ss>.cat([others=None,sep=None,na_rep=None])
#参数说明:
others:为None表示将<Ss>中的内容拼接起来
为Series/Index/DataFrame/np.ndarray/list-like表示将<Ss>与others(其中的元素只能为str)的对应元素拼接起来
sep:指定连接符;为str
#连接符被放在用于拼接的2个子字符串之间
na_rep:如果有缺失值,则将缺失值替换为na_rep后再拼接;为str
#如果为None,则拼接出来是NaN
#实例:
>>> s=pd.Series(["ASj23的sk看到了ASk","dKJDj","jk32s1dAA"])
>>> s.str.cat()
'ASj23的sk看到了ASkdKJDjjk32s1dAA'
>>> s2=pd.Series(["111","222","333"])
>>> s.str.cat(others=s2,sep="|")
0 ASj23的sk看到了ASk|111
1 dKJDj|222
2 jk32s1dAA|333
dtype: object
>>> s3=pd.Series(["aaa","bbb",None])
>>> s.str.cat(others=s3,sep="|")
0 ASj23的sk看到了ASk|aaa
1 dKJDj|bbb
2 NaN
dtype: object
>>> s.str.cat(others=s3,sep="|",na_rep="???")
0 ASj23的sk看到了ASk|aaa
1 dKJDj|bbb
2 jk32s1dAA|???
dtype: object
2.使用分隔符分割:
使用分隔符从左侧开始分割:<Ss>.split([pat=" ",maxsplit=-1,expand=False])
使用分隔符从右侧开始分割:<Ss>.rsplit([sep=" ",maxsplit=-1,expand=False])
#分隔符本身不包含在分割结果中
使用分隔符从左侧开始分割1次:<Ss>.partition([sep=" ",expand=True])
使用分隔符从右侧开始分割1次:<Ss>.rpartition([sep=" ",expand=True])
#分割为3部分:分割符前,分割符,分割符后
查看分割出的各个值出现的次数:<Ss>.get_dummies([sep="|"])
#分割规则同<Ss>.split(),且会完全分割
#参数说明:
pat/sep:指定分隔符;为str,默认为空格/"|"
#也可以为位置参数
maxsplit:指定最大分割次数;为int,默认为-1(表示直到分割完毕)
expand:为True表示将结果展开为DataFrame/MultiINdex object
为False表示直接返回Series/Index object
#实例:
>>> s=pd.Series(["stasaaskjksad","ssasd","sa aad"])
>>> s.str.split()
0 [stasaaskjksad]
1 [ssasd]
2 [sa, aad]
dtype: object
>>> s.str.split(pat="a")
0 [st, s, , skjks, d]
1 [ss, sd]
2 [s, , , d]
dtype: object
>>> s.str.split(pat="a",expand=True)
0 1 2 3 4
0 st s skjks d
1 ss sd None None None
2 s d None
>>> s.str.partition()
0 1 2
0 stasaaskjksad
1 ssasd
2 sa aad
>>> s.str.partition(sep="a",expand=False)
0 (st, a, saaskjksad)
1 (ss, a, sd)
2 (s, a, aad)
dtype: object
>>> s.str.get_dummies("a")
d s sd skjks ss st
0 0 1 1 0 1 0 1
1 0 0 0 1 0 1 0
2 1 1 1 0 0 0 0
三.增
1.填充:
在两侧填充指定字符到指定长度:<Ss>.center(width=None[,fillchar=" "])
#优先在右侧填充
在右侧填充指定字符到指定长度:<Ss>.ljust(width=None[,fillchar=" "])
在左侧填充指定字符到指定长度:<Ss>.rjust(width=None[,fillchar=" "])
在左侧填充"0"到指定长度:<Ss>.zfill(width=None)
在指定位置填充指定字符到指定长度:<Ss>.pad(width=None[,side="left",fillchar=" "])
#参数说明:
width:指定填充后的字符串长度;为int
#如果原字符串已经达到或超过该长度,则不变
fillchar:指定用于填充的字符;为str,默认为空格
side:指定填充位置;可为"left"(默认值)/"right"/"both"
#为"both"时优先在右侧填充
#实例:
>>> s=pd.Series(["aa","aaa","aa aa"])
>>> s.str.center(width=4,fillchar="*")
0 *aa*
1 aaa*
2 aa aa
dtype: object
>>> s.str.pad(width=4,fillchar="*",side="both")
0 *aa*
1 aaa*
2 aa aa
dtype: object
>>> s.str.zfill(width=6)
0 0000aa
1 000aaa
2 0aa aa
dtype: object
2.插入:
在字符间插入指定字符:<Ss>.join(sep=None)
#参数说明:
sep:指定要插入的字符;为str
#实例:
>>> s=pd.Series(["aaa","bb"])
>>> s.str.join(sep=" ")
0 a a a
1 b b
dtype: object
3.扩展:
将<Ss>扩展为指定倍:<Ss>.repeat(repeats=None)
#会将<Ss>中的每1行都复制为repeats份
#参数说明:
repeats:指定倍数;为int/int list
#实例:
>>> s=pd.Series(["aaa","bb"])
>>> s.str.repeat(repeats=3)
0 aaaaaaaaa
1 bbbbbb
dtype: object
>>> s.str.repeat(repeats=[2,1])
0 aaaaaa
1 bb
dtype: object
四.内容判断与查找
1.是否包含:
判断是否包含指定字符串:<Ss>.contains(pat=None[,case=True,flag=0,na=np.nan,regex=True])
#参数说明:
pat:指定字符串;为str(支持正则表达式)
#也可为位置参数
case:是否区分大小写;为bool
flag:指定传递到re模块的参数(用于正则表达式)
na:用于填充缺失值的值;默认为np.nan(即保持不变)
regex:是否允许在pat中使用正则表达式;为bool
#实例:
>>> s=pd.Series(["abcd","dcba","3wsdw",None,math.nan])
>>> s.str.contains("a")
0 True
1 True
2 False
3 None
4 NaN
dtype: object
>>> s.str.contains("^a",na=None)
0 True
1 False
2 False
3 None
4 NaN
dtype: object
2.起始/结束:
判断是否以指定字符串开始:<Ss>.match(pat=None[,case=True,flag=0,na=np.nan])
判断是否以指定字符串结束:<Ss>.endswith(pat=None[,na=np.nan])
#实例:接上
>>> s.str.match("a")
0 True
1 False
2 False
3 None
4 NaN
dtype: object
>>> s.str.endswith("a")
0 False
1 True
2 False
3 None
4 NaN
dtype: object
3.字符类型:
是否均为字母/数字/汉字:<Ss>.isalnum()
是否均为字母/汉字:<Ss>.isalpha()
是否均为数字:<Ss>.isdigit()
#支持特殊格式的阿拉伯数字,如①;但不支持中文
是否均为空白字符:<Ss>.isspace()
是否不包含大写字母且包含小写字母:<Ss>.islower()
是否不包含小写字母且包含大写字母:<Ss>.isupper()
是否符合标题格式:<Ss>.istitle()
#单词首字母为大写,其他字母均为小写
是否均为数字:<Ss>.isnumeric()
#支持中文及特殊格式的阿拉伯数字
是否均为数字:<Ss>.isdecimal()
#仅支持普通格式的阿拉伯数字,如1
#实例:
>>> s=pd.Series(["1获得sdd","大奖78"," ","ADCJK","SSDs","sad","Ads Jss","As DA","1①","31","一"])
>>> pd.DataFrame([s.str.isalnum(),s.str.isalpha(),s.str.isdigit(),s.str.isnumeric(),s.str.isdecimal(),s.str.isspace(),s.str.islower(),s.str.isupper(),s.str.istitle()])
0 1 2 3 4 5 6 7 8 9 10
0 True True False True True True False False True True True
1 False False False True True True False False False False True
2 False False False False False False False False True True False
3 False False False False False False False False True True True
4 False False False False False False False False False True False
5 False False True False False False False False False False False
6 True False False False False True False False False False False
7 False False False True False False False False False False False
8 False False False False False False True False False False False
4.查找指定内容:
查找并返回第1次匹配到的内容:<Ss>.extract(pat=None[,flags=0,expand=True])
查找并返回匹配到的所有内容:<Ss>.extractall(pat=None[,flags=0])
#返回匹配到的所有内容构成的DataFrame object
查找并返回匹配到的所有内容:<Ss>.findall(pat=None)
#返回Series对象,其中的元素为list
#参数说明:flags参数同 (1) 部分
pat:指定要查找的内容;为str(支持正则表达式)
#也可为位置参数
expand:为True表示返回DataFrame object
为False表示返回Series/Index/DataFrame object
#实例:
>>> s=pd.Series(['aSd','asd','dfd fsAsf sfs'])
>>> s.str.extract('([a-z]+)',expand=True)
0
0 a
1 asd
2 dfd
>>> s.str.extract('([a-z]+)',expand=False)
0 a
1 asd
2 dfd
dtype: object
>>> type(s.str.extract('([a-z]+)'))
<class 'pandas.core.frame.DataFrame'>
>>> type(s.str.extract('([a-z]+)',expand=False))
<class 'pandas.core.series.Series'>
>>> s.str.extractall('([a-z]+)')
0
match
0 0 a
1 d
1 0 asd
2 0 dfd
1 fs
2 sf
3 sfs
>>> s.str.findall('([a-z]+)')
0 [a, d]
1 [asd]
2 [dfd, fs, sf, sfs]
dtype: object
5.检索指定内容的位置:
从左往右检索指定内容在<Ss>中的位置:<Ss>.find(sub=None[])
从右往左检索指定内容在<Ss>中的位置:<Ss>.rfind()
#均返回sub在<Ss>中首次出现的起始位置(最左侧)的索引;如没有检索到,均返回-1
从左往右检索指定内容在<Ss>中的位置:<Ss>.index()
从右往左检索指定内容在<Ss>中的位置:<Ss>.rindex()
#均返回sub在<Ss>中首次出现的起始位置(最左侧)的索引;如没有检索到,均报错
#参数说明:
sub:指定要检索的内容;为str(支持正则表达式)
#也可为位置参数
start,stop:指定检索的起始/结束位置的索引;为int
#实例:
>>> s=pd.Series(["111aaaaffaaa","aaa2aa"])
>>>> s.str.find("aaa")
0 3
1 0
dtype: int64
>>> s.str.rfind("aaa")
0 9
1 0
dtype: int64
>>> s.str.find("ddd")
0 -1
1 -1
dtype: int64
>>> s.str.find("aa",start=4)
0 4
1 4
dtype: int64
>>> s.str.index("ddd")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\Euler\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\strings.py", line 2001, in wrapper
return func(self, *args, **kwargs)
File "C:\Users\Euler\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\strings.py", line 3242, in index
result = str_index(self._parent, sub, start=start, end=end, side="left")
File "C:\Users\Euler\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\strings.py", line 1447, in str_index
return _na_map(f, arr, dtype=np.dtype("int64"))
File "C:\Users\Euler\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\strings.py", line 130, in _na_map
return _map_object(f, arr, na_mask=True, na_value=na_result, dtype=dtype)
File "C:\Users\Euler\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\strings.py", line 215, in _map_object
result = lib.map_infer_mask(arr, f, mask.view(np.uint8), convert)
File "pandas\_libs\lib.pyx", line 2361, in pandas._libs.lib.map_infer_mask
File "C:\Users\Euler\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\strings.py", line 1443, in <lambda>
f = lambda x: getattr(x, method)(sub, start)
ValueError: substring not found
6.查找指定位置的内容:
查找指定位置的内容:<Ss>.get(i=None)
查找指定范围的内容:<Ss>.slice([start=0,stop=n,step=1])
#均返回Series对象
#参数说明:
i:指定位置的索引;为int
#也可为位置参数
start,stop,step:分别指定截取的起始位置/结束位置/步长;为int,默认为0/n/1
#n仅表示截取<Ss>直到结尾,但实际使用时不能直接写n;均可为位置参数
#实例:
>>> s=pd.Series(["s的3健d 34地方","ddf的耳34的d"])
>>> s.str.get(i=3)
0 健
1 的
dtype: object
>>> s.str.slice(1,7,2)
0 的健s
1 d的3
dtype: object
五.删改
1.换行:
使单词单独成行:<Ss>.wrap(width=None[,expand_tabs=True,replace_whitespace=True,drop_whitespace=True,break_long_words=True,break_on_hyphens=True])
#即在单词结尾处插入"\n"
#参数说明:
width:指定每行的最大长度;为int
#也可为位置参数
expand_tabs:是否将制表符扩展为(4个)空格;为bool
replace_whitespace:是否用空格替换所有空白;为bool
drop_whitespace:是否忽略空白(空格,制表符,换行符等);为bool
#即是否将空白视为1个单词
break_long_words:是否分解长度超过width的单词(通过空白分隔);为bool
#为True时,超过width的单词会被分解;为False时不会
break_on_hyphens:是否在连字符后换行;为bool
#实例:接上
>>> s.str.wrap(1)
0 a\na
1 a\na\na
2 a\na\na\na
dtype: object
>>> s.str.wrap(width=2)
0 aa
1 aa\na
2 aa\naa
dtype: object
>>> s=pd.Series(["aa ss"])
>>> s.str.wrap(width=2,expand_tabs=False,drop_whitespace=False)
0 aa\n \nss
dtype: object
>>> s.str.wrap(width=2,drop_whitespace=False)
0 aa\n \n \n \nss
dtype: object
>>> s.str.wrap(1)
0 a\na\ns\ns
dtype: object
>>> s.str.wrap(1,break_long_words=False)
0 aa\nss
dtype: object
>>> s=pd.Series(["aa ss sasajkjkajkj"])
>>> s.str.wrap(width=6,break_long_words=False)
0 aa\nss\nsasajkjkajkj
dtype: object
>>> s.str.wrap(width=7,break_long_words=False)
0 aa ss\nsasajkjkajkj
dtype: object
2.去除边缘处的字符:
删除两侧的指定字符:<Ss>.strip([to_strip=" "])
删除右侧的指定字符:<Ss>.rstrip([to_strip=" "])
删除左侧的指定字符:<Ss>.lstrip([to_strip=" "])
#参数说明:
to_strip:指定要删除的字符;为str,默认为空格
#也可为位置参数
#实例:
>>> s=pd.Series([" sta","ss","sa "],index=["a","b","c"])
>>> print(s)
a sta
b ss
c sa
dtype: object
>>> s2=s.str.strip()
>>> print(s2)
a sta
b ss
c sa
dtype: object
3.修改:
修改指定内容:<Ss>.replace(pat=None,repl=None[,n=-1,case=None,flags=0])
修改指定字符:<Ss>.translate(table=None)
#参数说明:
pat:指定要替换的内容;为str(支持正则表达式)/编译了的正则表达式
#也可为位置参数
repl:指定要替换成的内容;为str/function
n:指定最大替换次数;为int,默认为-1(替换所有)
case:是否区分大小写;为bool,若pat为str则默认为True
#若pat为编译了的正则表达式(参见 python.正则表达式re模块.四 部分的re.compile())则不能设置
flags:指定要传递给re模块的参数
#若pat为编译了的正则表达式则不能设置
table:指定如何更新字符;为dict,格式为{
<ord>:<sub>}(key为ASCII码,value为str/ASCII码/None)
#虽然key/value都可以是ASCII码,但替换的/替换为的均是相应的char而非int
#实例:
>>> s=pd.Series(["aaab3sdsB42","asb3234da","aaabds"])
>>> s.str.replace("b[0-9]*","qqq")
0 aaaqqqsdsB42
1 asqqqda
2 aaaqqqds
dtype: object
>>> s.str.replace("b[0-9]*","qqq",case=False)
0 aaaqqqsdsqqq
1 asqqqda
2 aaaqqqds
dtype: object
>>> s.str.translate(table={
ord("a"):"d",ord("s"):ord("3"),ord("2"):None})
0 dddb33d3B4
1 d3b334dd
2 dddbd3
dtype: object
4.修改指定位置处的内容:
更新指定位置处的内容:<Ss>.slice_replace(start=None,stop=None,repl=None)
#参数说明:start/stop同 4.(6) 部分;repl同 (3) 部分
#实例:接上
>>> s.str.slice_replace(2,4,"www")
0 aawww3sdsB42
1 aswww234da
2 aawwwds
dtype: object
六.其他
1.统计:
统计字符串长度:<Ss>.len()
统计指定字符串出现的次数:<Ss>.count(pat=None[,flags=0])
#参数说明:同 4.(1) 部分的<Ss>.contains(
#实例:
>>> s=pd.Series(["asaaasdaa","saadaadsAa"])
>>> s.str.len()
0 9
1 10
dtype: int64
>>> s.str.count(pat="aa")
0 2#也就是说,在字符串的某部分被匹配上后,不会再用于之后的匹配
1 2
dtype: int64
>>> s=pd.Series(["asaaaasdaa","saadaadsAa"])
>>> s.str.count(pat="aa")
0 3
1 2
dtype: int64
2.编/解码:
编码为字节对象:<Ss>.encode(encoding=None[,error="static"])
解码为字符串:<Ss>.decode(encoding=None[,error="static"])
返回字符串的Unicode标准格式:<Ss>.normalize(form=None)
#参数说明:
encoding:指定编码方式;为str
#也可为位置参数
error:指定出现错误时如何处理;可取值见下
为"static"(默认值)表示抛出异常
为"ignore"表示忽略非法字符
为"replace"表示使用?替代非法字符
为"xmlcharrefreplace"表示通过XML的字符引用表示非法字符
为"backslashreplace"表示用Python的反向转义序列表示非法字符
form:指定规范化Unicode的标准;可为"NFC"/"NFKC"/"NFD"/"NFKD"
#实例:
>>> s=pd.Series(["我是JACK","阿斯顿发"])
>>> s.str.encode("utf-8")
0 b'\xe6\x88\x91\xe6\x98\xafJACK'
1 b'\xe9\x98\xbf\xe6\x96\xaf\xe9\xa1\xbf\xe5\x8f...
dtype: object
>>> s.str.encode("ascii","ignore")
0 b'JACK'
1 b''
dtype: object
>>> s.str.encode("ascii","replace")
0 b'??JACK'
1 b'????'
dtype: object
>>> s.str.encode("ascii","xmlcharrefreplace")
0 b'我是JACK'
1 b'阿斯顿发'
dtype: object
>>> s.str.encode("ascii","backslashreplace")
0 b'\\u6211\\u662fJACK'
1 b'\\u963f\\u65af\\u987f\\u53d1'
dtype: object
>>> s.str.normalize("NFC")
0 我是JACK
1 阿斯顿发
dtype: object
>>> s=pd.Series([b"asdfghjkl",b"qwertyuiop",b"zxcvbnm"])
>>> s.str.decode("ascii")
0 asdfghjkl
1 qwertyuiop
2 zxcvbnm
dtype: object