7.3 字符串操作
7.3.1 字符串对象方法
# 以逗号分隔的字符串可以⽤split拆分成数段
In [134]: val = 'a,b, guido'
In [135]: val.split(',')
Out[135]: ['a', 'b', ' guido']
# split常常与strip⼀起使⽤,以去除空⽩符(包括换⾏符)
In [136]: pieces = [x.strip() for x in val.split(',')]
In [137]: pieces
Out[137]: ['a', 'b', 'guido']
# 利⽤加法,可以将这些⼦字符串以双冒号分隔符的形式连接起来
In [138]: first, second, third = pieces
In [139]: first + '::' + second + '::' + third
Out[139]: 'a::b::guido'
# 检测⼦串的最佳⽅式是利⽤Python的in关键字,还可以使⽤index和find
In [141]: 'guido' in val
Out[141]: True
In [142]: val.index(',')
Out[142]: 1
In [143]: val.find(':')
Out[143]: -1
# 注意find和index的区别:如果找不到字符串,index将会引发⼀个异常(⽽不是返回-1)
In [144]: val.index(':')
---------------------------------------------------------------------------
ValueError Traceback (most recent <ipython-input-144-280f8b2856ce> in <module>()
----> 1 val.index(':')
ValueError: substring not found
# count可以返回指定⼦串的出现次数
In [145]: val.count(',')
Out[145]: 2
# replace⽤于将指定模式替换为另⼀个模式
In [146]: val.replace(',', '::')
Out[146]: 'a::b:: guido'
In [147]: val.replace(',', '')
Out[147]: 'ab guido'
-
python内置字符串方法
函数 说明 count 返回指定⼦串的出现次数 endswith, startswith 如果字符串以某个后缀结尾(以某个前缀开头),则返回True join 将字符串用作连接其他字符串序列的分隔符 index 如果在字符串中找到子串,则返回子串第一个字符所在的位置。如果没有找到,则引发valueError。 find 如果在字符串中找到子串,则返回第一个发现的子串的第一个字符所在的位置。如果没有找到,则返回-1 rfind 如果在字符串中找到子串,则返回最后一个发现的子串的第一个字符所在的位置。如果没有找到,则返回-1 replace 用另一个字符串替换指定子串 strip, rstrip, lstrip 去除空白符(包括换行符)。相当于对各个元素执行x.strip()(以及rstrip. lstrip) split 通过指定的分隔符将字符串拆分为一组子串 lower, upper 分别将字母字符转换为小写或大写 ljust, rjust 用空格(或其他字符)填充字符串的空白侧以返回符合最低宽度的字符串
7.3.2 pandas的矢量化字符串函数
# 清理待分析的散乱数据时,常常需要做⼀些字符串规整化⼯作
In [167]: data = {'Dave': 'dave@google.com', 'Steve': 'steve@gmail.com',
......: 'Rob': 'rob@gmail.com', 'Wes': np.nan}
In [168]: data = pd.Series(data)
In [169]: data
Out[169]:
Dave dave@google.com
Rob rob@gmail.com
Steve steve@gmail.com
Wes NaN
dtype: object
In [170]: data.isnull()
Out[170]:
Dave False
Rob False
Steve False
Wes True
dtype: bool
# 通过data.map,所有字符串和正则表达式⽅法都能被应⽤于(传⼊lambda表达式或其他函数)各个值,但是如果存在NA(null)就会报错。
# 可以通过str.contains检查各个电⼦邮件地址是否含有"gmail"
In [171]: data.str.contains('gmail')
Out[171]:
Dave False
Rob True
Steve True
Wes NaN
dtype: object
# 也可以使⽤正则表达式,还可以加上任意re选项
In [172]: pattern
Out[172]: '([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\\.([A-Z]{2,4})'
In [173]: data.str.findall(pattern, flags=re.IGNORECASE)
Out[173]:
Dave [(dave, google, com)]
Rob [(rob, gmail, com)]
Steve [(steve, gmail, com)]
Wes NaN
dtype: object
# 有两个办法可以实现⽮量化的元素获取操作:要么使⽤str.get,要么在str属性上使⽤索引
In [174]: matches = data.str.match(pattern, flags=re.IGNORECASE)
In [175]: matches
Out[175]:
Dave True
Rob True
Steve True
Wes NaN
dtype: object
# 要访问嵌⼊列表中的元素,我们可以传递索引到这两个函数中
In [176]: matches.str.get(1)
Out[176]:
Dave NaN
Rob NaN
Steve NaN
Wes NaN
dtype: float64
In [177]: matches.str[0]
Out[177]:
Dave NaN
Rob NaN
Steve NaN
Wes NaN
dtype: float64
# 可以利⽤这种⽅法对字符串进⾏截取
In [178]: data.str[:5]
Out[178]:
Dave dave@
Rob rob@g
Steve steve
Wes NaN
dtype: object