# 字符串的向量化操作 数据科学的处理离不开字符串的处理,相应的pandas也提供了字符串向量化操作的功能,我们一般利用这个来对采集来的信息进行清理。 我们可以使用python的方式来处理字符串,但是一旦字符串中包含缺省值,此时,使用pandas的字符串向量化功能就能避免出现崩溃的情况。 ```python # import pandas as pd strs = ['One', "Two", "Three", None, "Four"] strs = pd.Series(strs) print(strs) ``` 0 One 1 Two 2 Three 3 None 4 Four dtype: object ## 字符串向量化应用初步 ```python #对字符串进行大写转换 s = strs.str.upper() print(s) # 对字符串进行小写转换 ss = strs.str.lower() print("\n\n", ss) ``` 0 ONE 1 TWO 2 THREE 3 None 4 FOUR dtype: object 0 one 1 two 2 three 3 None 4 four dtype: object ## 其他pandas字符串方法 python中字符串的方法基本上可以直接应用在pandas中,需要注意的是返回值的不同,需要相应做出调整,例如判断类的返回的是一个bool值的数据结构,len之类的返回的是一个值。 相应字符串方法不在一一举例,需要的时候可以查看手册。 ## 正则表达式 正则是字符串的大杀器,在pandas中同样也实现了正则的一些接口,如以下API: - match: 调用re.match, 返回bool类型内容 - extract: 调用re.match, 返回匹配的字符串组groups - findall: 调用re.findall - replace: 正则的替换模式 - contains: re.search,返回bool内容 - count: 利用正则模式统计数量 - split:等价于 str.split, 支持正则 - rsplit: 等价于str.rsplit,支持正则 ```python print("strs = \n", strs) print() a = strs.str.extract('([O, o, n, e, N, T ]+)') print(a) ``` strs = 0 One 1 Two 2 Three 3 None 4 Four dtype: object 0 0 One 1 T 2 T 3 NaN 4 o ## 其他字符串的使用方法 pandas还提供了一些其他的方法来实现字符串的操作。 - get: 获取索引位置上的值,start=0 - slice: 对元素进行切片 - slice_replace: 对元素进行切片替换 - cat: 连接字符串 - repeat:重复元素 - normalize: 将字符串转换为Unicode规范形式 - pad: 在字符串的左边,右边或者两边增加空格 - wrap:将字符串按照指定宽度换行 - join: 用分隔符链接Series的每个元素 - get_dummies: 按照分隔符提取每个元素的dummy变量,转换为one-hot编码的DataFrame ```python # 对slice的使用和函数的直接切片一个效果 # df.str.slice(2,5) 等于 df.str[2:5] print("strs = \n", strs) print() a = strs.str.slice(1,4) print(a) print() # 等价于 b = strs.str[1:4] print(b) ``` strs = 0 One 1 Two 2 Three 3 None 4 Four dtype: object 0 ne 1 wo 2 hre 3 None 4 our dtype: object 0 ne 1 wo 2 hre 3 None 4 our dtype: object ```python # df.str.get(i) 和 df.str[i]功能类似 # 以下案例用字母o切分字符串后选择后面的一组 a = strs.str.split('o').str.get(-1) print(a) ``` 0 One 1 2 Three 3 None 4 ur dtype: object iii. v. get_dummies 如果数据中包含已经被编码的指标(coded indicator), 可以使用get_dummies快速的把编码的信息分解。 ```python # 假定: A=游泳, B=爬山, C=跑步, D=篮球 df = pd.DataFrame({'english':strs, 'hobbies':["B|C", "A|C|D", "B|D", "A|B|C", "A|B|C|D"]}) print(df) print() a = df['hobbies'].str.get_dummies('|') print(a) ``` english hobbies 0 One B|C 1 Two A|C|D 2 Three B|D 3 None A|B|C 4 Four A|B|C|D A B C D 0 0 1 1 0 1 1 0 1 1 2 0 1 0 1 3 1 1 1 0 4 1 1 1 1