Administrator@cibpc-019 MINGW64 /
$ ipython
Python 3.6.7(default, Jul 22019,02:21:41)[MSC v.190064 bit (AMD64)]
Type 'copyright','credits'or'license'for more information
IPython 7.8.0-- An enhanced Interactive Python. Type '?'forhelp.
In [1]:import numpy as np
In [2]:import pandas as pd
# 示例数据(常规数据)
In [3]: data =['peter','Paul','MARY','GuiDO']# 数据值正常时的操作方法
In [4]:[s.capitalize()for s in data]
Out[4]:['Peter','Paul','Mary','Guido']# 实际上, 这才是我们经常碰到的常规数据, 对吧? :)
In [5]: data =['peter','Paul','MARY','GuiDO',None]# 这种处理方法就不太友好了
In [6]:[s.capitalize()for s in data]---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)<ipython-input-6-bb1b424b25b0>in<module>---->1[s.capitalize()for s in data]<ipython-input-6-bb1b424b25b0>in<listcomp>(.0)---->1[s.capitalize()for s in data]
AttributeError:'NoneType'object has no attribute 'capitalize'
In [7]: names = pd.Series(data)
In [8]: names
Out[8]:0 peter
1 Paul
2 MARY
3 GuiDO
4None
dtype:object# 这是正经的向量化字符串操作, 有没有很6. 只需要关注操作的方法即可, 不用操心异常数值.
In [9]: names.str.capitalize()
Out[9]:0 Peter
1 Paul
2 Mary
3 Guido
4None
dtype:object
In [10]: monte = pd.Series(['Graham Chapman','John Cleese','Terry Gilliam','Eric idle'])
In [11]: monte
Out[11]:0 Graham Chapman
1 John Cleese
2 Terry Gilliam
3 Eric idle
dtype:object# 返回全小写
In [12]: monte.str.lower()
Out[12]:0 graham chapman
1 john cleese
2 terry gilliam
3 eric idle
dtype:object# 返回int型
In [13]: monte.str.len()
Out[13]:01411121339
dtype: int64
# 返回布尔型
In [14]: monte.str.startswith('T')
Out[14]:0False1False2True3False
dtype:bool# 返回list
In [15]: monte.str.split()
Out[15]:0[Graham, Chapman]1[John, Cleese]2[Terry, Gilliam]3[Eric, idle]
dtype:object
2.3 pandas 字符串向量化操作支持正则表达式
2.3.1 pandas 支持正则表达式操作与python的re 模块相通, 关系如下:
方法
描述
match()
对每个元素调用re.match(), 返回布尔类型值
extract()
对每个元素调用re.match(), 返回匹配的字符串组(groups)
findall()
对每个元素调用re.findall()
replace()
用正则模式替换字符串
contains()
对每个元素调用re.search(), 返回布尔类型值
count()
计算符合正则模式的字符串的数量
split()
等价于str.split(), 支持正则表达式
rsplit()
等价于str.rsplit(), 支持正则表达式
2.3.2 代码示例
In [16]: monte.str.extract('([A-Za-z]+)')
Out[16]:00 Graham
1 John
2 Terry
3 Eric
In [17]: monte.str.findall(r'^[^AEIOU].*[^aeiou]$')
Out[17]:0[Graham Chapman]1[]2[Terry Gilliam]3[]
dtype:object
2.4 其它字符串方法
2.4.1 方法列表
方法
描述
get()
获取元素索引位置上的值, 索引从0开始
slice()
对元素进行切片取值
slice_replace()
对元素进行切片替换
cat()
连接字符串
repeat()
重复元素
normalize()
将字符串转换为Unicode规范形式
pad()
在字符串的左边\ 右边或两边增加空格
wrap()
将字符串按指定宽度换行
join()
用分隔符连接Series的每个元素
get_dummies()
按照分隔符提取每个元素的dummy变量, 转换为独热(one-hot)编码的DataFrame
2.4.2 代码示例
In [18]: monte.str[:3]
Out[18]:0 Gra
1 Joh
2 Ter
3 Eri
dtype:object# 这两种等效
In [19]: monte.str.slice(0,3)
Out[19]:0 Gra
1 Joh
2 Ter
3 Eri
dtype:object
In [20]: monte.str.get(3)
Out[20]:0 h
1 n
2 r
3 c
dtype:object# 这两种操作方法等效
In [21]: monte.str[3]
Out[21]:0 h
1 n
2 r
3 c
dtype:object# 综合运用
In [22]: monte.str.split().str.get(-1)
Out[22]:0 Chapman
1 Cleese
2 Gilliam
3 idle
dtype:object