向量化字符串操作¶
Pandas 提供了一系列字符串操作的功能,在进行数据清洗时非常重要。尤其从互联网获取的很多信息杂乱无章,需要进行局部清洗时更有必要。
Pandas 字符串操作简介¶
我们从Numpy 和 Pandas 看出,在处理数据方面,尤其是数字方面具有很强的统一化操作优势,如:
import numpy as np
x = np.array([2, 3, 5, 7, 11, 13])
x * 2
array([ 4, 6, 10, 14, 22, 26])
这是一种向量化操作,不必担心数组长度和维度,只需要关心操作本身即可。在numpy 中没有对字符串的简单接口,因此,用for循环结构来处理:
data = ['peter', 'Paul', 'MARY', 'gUIDO']
[s.capitalize() for s in data]
['Peter', 'Paul', 'Mary', 'Guido']
有时这种方法是有效的,但如果数据中出现缺失值,可能会出现一些异常:
data = ['peter', 'Paul', None, 'MARY', 'gUIDO']
[s.capitalize() for s in data]
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Cell In[12], line 2 1 data = ['peter', 'Paul', None, 'MARY', 'gUIDO'] ----> 2 [s.capitalize() for s in data] AttributeError: 'NoneType' object has no attribute 'capitalize'
Pandas为包含字符串的Series 和 Index对象提供了Str属性,是一种两全其美的方法,如下:
import pandas as pd
names = pd.Series(data)
names
0 peter 1 Paul 2 None 3 MARY 4 gUIDO dtype: object
names.str.capitalize()
0 Peter 1 Paul 2 None 3 Mary 4 Guido dtype: object
在str 属性后面使用 Tab键,可以看到Pandas支持向量化字符串的所有方法。
Pandas 字符串方法列表¶
我们用一系列人名进行示例:
monte = pd.Series(['Graham Chapman', 'John Cleese', 'Terry Gilliam',
'Eric Idle', 'Terry Jones', 'Michael Palin Ge'])
monte
0 Graham Chapman 1 John Cleese 2 Terry Gilliam 3 Eric Idle 4 Terry Jones 5 Michael Palin Ge dtype: object
与Python类似的字符串方法¶
几乎所有Python内置的方法都被复制到Pandas向量化字符串方法中了。在pandas的str 方法中借鉴Python方法有:
| | | | |
|-------------|------------------|------------------|------------------|
|len() | lower() | translate() | islower() |
|ljust() | upper() | startswith() | isupper() |
|rjust() | find() | endswith() | isnumeric() |
|center() | rfind() | isalnum() | isdecimal() |
|zfill() | index() | isalpha() | split() |
|strip() | rindex() | isdigit() | rsplit() |
|rstrip() | capitalize() | isspace() | partition() |
|lstrip() | swapcase() | istitle() | rpartition() |
这些方法返回值不同,如lower()返回的是一个字符串Series:
monte.str.lower()
0 graham chapman 1 john cleese 2 terry gilliam 3 eric idle 4 terry jones 5 michael palin ge dtype: object
但是有些返回值返回的是数字:
monte.str.len()
0 14 1 11 2 13 3 9 4 11 5 16 dtype: int64
又或者是布尔型数值形成的序列:
monte.str.startswith('T')
0 False 1 False 2 True 3 False 4 True 5 False dtype: bool
还有些返回的是列表或者其他:
monte.str.split()
0 [Graham, Chapman] 1 [John, Cleese] 2 [Terry, Gilliam] 3 [Eric, Idle] 4 [Terry, Jones] 5 [Michael, Palin, Ge] dtype: object
正则表达式方法¶
还有很多方法可以接受正则表达式,正则表达式合理处理字符串的Python方法,这些方法在python内置的 re 包中:
| 方法 | 描述 |
|---|---|
match() |
对每一个元素调用 re.match(), 返回布尔型. |
extract() |
对每一个元素调用re.extrat() , 返回匹配的字符串. |
findall() |
对每一个元素调用 re.findall() |
replace() |
将一个字符串替换为另一个 |
contains() |
对每一个元素调用 re.search() , 返回布尔型 |
count() |
计算符合正则模式的字符串数量 |
split() |
与 str.split()相同, 支持正则表达式 |
rsplit() |
与 str.rsplit()相同, 支持正则表达式 |
通过这些操作,可以进行一些有趣的操作。如提取元素前面的连续字母作为每个人的名字:
monte.str.extract('([A-Za-z]+)', expand=False)
0 Graham 1 John 2 Terry 3 Eric 4 Terry 5 Michael dtype: object
还有,找出开头和结尾都是辅音字母的名字,开头使用 (^) ,结尾使用 ($) 正则化表达字符:
monte.str.findall(r'^[^AEIOU].*[^aeiou]$')
0 [Graham Chapman] 1 [] 2 [Terry Gilliam] 3 [] 4 [Terry Jones] 5 [] dtype: object
其他字符串方法¶
| 方法 | 描述 |
|---|---|
get() |
获取元素索引位置上的值 |
slice() |
对元素进行切片取值 |
slice_replace() |
对元素进行切片替换 |
cat() |
连接字符串 |
repeat() |
重复元素 |
normalize() |
返回字符串 Unicode形态 |
pad() |
在字符串左边、右边或两边增加空格 |
wrap() |
将字符串按照指定的宽度换行 |
join() |
用分隔符连接每一个Series元素 |
get_dummies() |
依据分隔符提取每个元素的虚拟变量(dummy) |
向量化字符串与切片¶
monte.str[0:3]
0 Gra 1 Joh 2 Ter 3 Eri 4 Ter 5 Mic dtype: object
其他内容详细阅读相关文献。