Python 第三方模块 数据分析 Pandas模块 字符串处理

在这里插入图片描述
一.大小写转换
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 objectFalse表示直接返回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 objectFalse表示返回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)
01    的
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'&#25105;&#26159;JACK'
1    b'&#38463;&#26031;&#39039;&#21457;'
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

猜你喜欢

转载自blog.csdn.net/weixin_46131409/article/details/113176809