str属性
- 官方docs
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(' ')
,括号中是分割依据的字符串。
选取分割后的一部分,有两种方法:
str.split(' ').get(0)
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
。
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[ab])(?P\d)', expand=True)
Out[23]:
letter digit
0 a 1
1 b 2
2 NaN NaN
# '(?P[ab])(?P\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[a-z])(?P[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。