s = pd.Series(['amazon','alibaba','baidu'])
s.str.count('a')021321
假如用内置的字符串函数进行操作,需要进行遍历,且Python原生的遍历操作无法处理缺失值。
#用循环进行处理
s =['amazon','alibaba','baidu'][i.count('a')for i in s][2,3,1]#存在缺失值时,打印报错
s =['amazon','alibaba','baidu',None][i.count('a')for i in s]
AttributeError:'NoneType'object has no attribute 'lower'
Pandas的向量化操作,能够正确的处理缺失值,无报错信息,如下
s = pd.Series(['amazon','alibaba','baidu',None])
s.str.count('a')
Out[36]:02.013.021.03 NaN
dtype: float64
#按数字分割
s = pd.Series(['QQ1252号码','QQ1353加我','我389的'])
s.str.split('\d+')0[QQ, 号码]1[QQ, 加我]2[我, 的]# 按固定字符分割
s = pd.Series(['a_b_c','c_d_e', np.nan,'f_g_h'])
s.str.split('_')0[a, b, c]1[c, d, e]2 NaN
3[f, g, h]#切分后的列表中的元素可以通过get方法或者 [] 方法进行读取
s.str.split('_').str.get(1)
Out[96]:0 b
1 d
2 NaN
3 g
#使用expand方法可以轻易地将这种返回展开为一个数据表
s.str.split('_', expand=True)0120 a b c
1 c d e
2 NaN NaN NaN
3 f g h
#同样,我们也可以限制切分的次数:
s.str.split('_', expand=True, n=1)010 a b_c
1 c d_e
2 NaN NaN
3 f g_h
flags:int,默认 0(无标志)。正则表达式模块标志,例如重新忽略。如果 pat 是已编译的正则表达式,则无法设置。
regex:布尔值,默认为真。确定 passed-in 模式是否为正则表达式:
如果为 True,则假定 passed-in 模式是正则表达式。
如果为 False,则将模式视为文字字符串
如果 pat 是已编译的正则表达式或 repl 是可调用的,则不能设置为 False。
3)案例分析
replace方法默认使用正则表达式
s = pd.Series(['A','B','C','Aaba','Baca','', np.nan,'CABA','dog','cat'])
s.str.replace('^.a|dog','XX-XX ',case=False)
Out[27]:0 A
1 B
2 C
3 XX-XX ba
4 XX-XX ca
56 NaN
7 XX-XX BA
8 XX-XX
9 XX-XX t
pd.Series(['foo','fuz', np.nan]).str.replace('f.','ba', regex=True)0 bao
1 baz
2 NaN
pd.Series(['f.o','fuz', np.nan]).str.replace('f.','ba', regex=False)0 bao
1 fuz
2 NaN
4.findall()
1)基础用法
Series.str.findall(pat, flags=0)
2)参数解释
pat:正则表达式
flags:Flags from re module, e.g. re.IGNORECASE (default is 0, which means no flags),是否忽略大小写。
s = pd.Series(['马 云:2000亿','马化腾:1800亿','王健林:1200亿','小伍哥:0.000012亿'])
s.str.slice(0,3)0 马 云
1 马化腾
2 王健林
3 小伍哥
s = pd.Series([koala, dog, chameleon])
s
0 koala
1 dog
2 chameleon
s.str.slice(start=1)0 oala
1 og
2 hameleon
s.str.slice(start=-1)0 a
1 g
2 n
s.str.slice(stop=2)0 ko
1 do
2 ch
s.str.slice(step=2)0 kaa
1 dg
2 caeen
s.str.slice(start=0, stop=5, step=3)0 kl
1 d
2 cm
s.str[0:5:3]0 kl
1 d
2 cm
s = pd.Series(['马 云:2000亿','马化腾:1800亿','王健林:1200亿','小伍哥:0.000012亿'])
s.str.get(0)0 马
1 马
2 王
3 小
s = pd.Series([String,(1,2,3),[a, b, c],123,-456,{1: Hello,2: World}])
s.str.get(1)0 t
122 b
3 NaN
4 NaN
5 Hello
s = pd.Series(['马 云:2000亿','马化腾:1800亿','王健林:1200亿','小伍哥:0.000012亿'])#切片替换
s.str.slice_replace(0,3,'小伍哥')0 小伍哥:2000亿
1 小伍哥:1800亿
2 小伍哥:1200亿
3 小伍哥:0.000012亿
s.str.join('-')0 马--云-:-2-0-0-0-亿
1 马-化-腾-:-1-8-0-0-亿
2 王-健-林-:-1-2-0-0-亿
3 小-伍-哥-:-0-.-0-0-0-0-1-2-亿
s = pd.Series(['A','E','C','D','E'])
s.str.get_dummies()
A C D E
0100010001201003001040001
6.get_dummies()
Series 中的每个字符串都由 sep 拆分,并作为虚拟/指标变量的 DataFrame 返回。
1)基础用法
Series.str.get_dummies(sep='|')
2)参数解释
sep:str,默认 “|”
要拆分的字符串。
3)案例分析
pd.Series(['a|b','a','a|c']).str.get_dummies()
a b c
011011002101
pd.Series(['a|b', np.nan,'a|c']).str.get_dummies()
a b c
011010002101
monte = pd.Series(['Graham Chapman','John Cleese','Terry Gilliam','Eric Idle','Terry Jones','Michael Palin'])
full_monte = pd.DataFrame({'name': monte,'info':['B|C|D','B|D','A|C','B|D','B|C','B|C|D']})
full_monte
name info
0 Graham Chapman B|C|D
1 John Cleese B|D
2 Terry Gilliam A|C
3 Eric Idle B|D
4 Terry Jones B|C
5 Michael Palin B|C|D