Python数据分析_Pandas07_字符串数据

str属性

str属性只对series。

可以用来对数据框的列名和文字列进行操作。

常用操作

s = pd.Series(['A', 'B', 'C', 'Aaba ', 'Baca ', np.nan, ' CABA', 'dog', 'cat'])
s.str.lower()
s.str.upper()
s.str.len()

s.str.strip()
s.str.lstrip()
s.str.rstrip()
s.str.replace(' ','_')

分割

分割str.split(' '),括号中是分割依据的字符串。

选取分割后的一部分,有两种方法:

  1. str.split(' ').get(0)
  2. str.split(' ').str[0]
In [5]: s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])

In [6]: s2.str.split('_')
Out[6]:
0    [a, b, c]
1    [c, d, e]
2          NaN
3    [f, g, h]
dtype: object

In [7]: s2.str.split('_').str.get(1)
Out[7]:
0      b
1      d
2    NaN
3      g
dtype: object

In [8]: s2.str.split('_').str[1]
Out[8]:
0      b
1      d
2    NaN
3      g
dtype: object

expand=True参数将字符串拆分成多列,返回一个数据框。

n=1参数指定拆分次数。str.split()默认从左向右拆分,str.rsplit()从右往左拆分。

In [9]: s2.str.split('_', expand=True)
Out[9]:
     0     1     2
0    a     b     c
1    c     d     e
2  NaN  None  None
3    f     g     h

In [12]: s2.str.rsplit('_', expand=True, n=1)
Out[12]:
     0     1
0  a_b     c
1  c_d     e
2  NaN  None
3  f_g     h

替换

replace,findall可以接受正则表达式。要注意正则表达式中的元字符,如$|^|.|?,等,给它们加上\进行转义。

In [13]: s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',
    ...:                 '', np.nan, 'CABA', 'dog', 'cat'])

In [14]: s3.str.replace('^.a|dog', 'XX_', case=False)
Out[14]:
0        A
1        B
2        C
3    XX_ba
4    XX_ca
5
6      NaN
7    XX_BA
8      XX_
9     XX_t
dtype: object
# '^.a|dog' == 以(.)任意字符+a 或 dog (^)开头的字符串
# case=False 不区分大小写

选取字符串数据

可以用str[n]来选择一列字符串中的第n个字符,没有的显示NaN。

In [15]: s4 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan,
    ...:                 'CABA', 'dog', 'cat'])
    ...: s4.str[1]
    ...:
Out[15]:
0    NaN
1    NaN
2    NaN
3      a
4      a
5    NaN
6      A
7      o
8      a
dtype: object

提取

返回第一个匹配成功的字符串:str.extract(regex, expand=False)

expand=True返回dataframe。expand=False返回Series/Index/DataFrame,如果只匹配到一列返回series,匹配不到返回index,匹配多列dataframe。默认False。

最好加上expand参数,不然会有FuturaWarning。

给匹配到的列添加列名,(?P<col_name>regex)

In [17]: s = pd.Series(['a1', 'b2', 'c3'])

In [18]: type(s.str.extract('[ab](\d)', expand=True))
Out[18]: pandas.core.frame.DataFrame

In [19]: type(s.str.extract('[ab](\d)', expand=False))
Out[19]: pandas.core.series.Series

In [21]: s.str.extract('[ab](\d)', expand=True)
Out[21]:
     0
0    1
1    2
2  NaN
# '[ab](\d)' a或b[匹配但不提取] 接 \d任意数字(匹配且提取组) 

In [23]: s.str.extract('(?P<letter>[ab])(?P<digit>\d)', expand=True)
Out[23]:
  letter digit
0      a     1
1      b     2
2    NaN   NaN
# '(?P<letter>[ab])(?P<digit>\d)'第一组列名为letter,匹配a或b。
# 第二组列名为digit,匹配任意数字。

提取所有

提取所有匹配成功的字符串并返回,str.extractall(regex)

In [24]: s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"])

In [25]: two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'

In [26]: s.str.extract(two_groups, expand=True)
Out[26]:
  letter digit
A      a     1
B      b     1
C      c     1

In [27]: s.str.extractall(two_groups)
Out[27]:
        letter digit
  match
A 0          a     1
  1          a     2
B 0          b     1
C 0          c     1

str.match(regex) 和 str.contains(regex)

返回布尔型结果。

In [28]: pattern = r'[a-z][0-9]'

In [29]: pd.Series(['h1', '2s4', '3a', '3b', 'c03c']).str.contains(pattern)
Out[29]:
0     True
1     True
2    False
3    False
4     True
dtype: bool

In [30]: pd.Series(['h1', '2s4', '3a', '3b', 'c03c']).str.match(pattern)
Out[30]:
0     True
1    False
2    False
3    False
4     True
dtype: bool

match依据的是re.match,而contains依据的是re.search。

    原文作者:ChZ_CC
    原文地址: https://www.jianshu.com/p/31daa943cd2b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞