1 str 对象
1.1 str 对象的设计意图
str 对象是定义在 Index 或 Series 上的属性,专门用于逐元素处理文本内容,其内部定义了大量方法,因此 对一个序列进行文本处理,首先需要获取其 str 对象。在 Python 标准库中也有 str 模块,为了使用上的便 利,有许多函数的用法 pandas 照搬了它的设计,例如字母转为大写的操作
1.2 [] 索引器
对于 str 对象而言,可理解为其对字符串进行了序列化的操作,例如在一般的字符串中,通过 [] 可以取出某个位置的元素,同时也能通过切片得到子串。通过对 str 对象使用 [] 索引器,可以完成完全一致的功能,并且如果超出范围则返回缺失值
1.3 string 类型
从 pandas 的 1.0.0 版本开始,引入了 string 类型,其引入的动机在于:原来所有的字符串类 型都会以 object 类型的 Series 进行存储,但 object 类型只应当存储混合类型,例如同时存储浮点、字符串、 字典、列表、自定义类型等,因此字符串有必要同数值型或 category 一样,具有自己的数据存放类型,从而 引入了 string 类型。
总体上说,绝大多数对于 object 和 string 类型的序列使用 str 对象方法产生的结果是一致,但是在下面提到 的两点上有较大差异:
首先,应当尽量保证每一个序列中的值都是字符串的情况下才使用 str 属性,但这并不是必须的,其必要条 件是序列中至少有一个可迭代(Iterable)对象,包括但不限于字符串、字典、列表。对于一个可迭代对象, string 类型的 str 对象和 object 类型的 str 对象返回结果可能是不同的。
总体上说,绝大多数对于 object 和 string 类型的序列使用 str 对象方法产生的结果是一致,但是在下面提到 的两点上有较大差异:
首先,应当尽量保证每一个序列中的值都是字符串的情况下才使用 str 属性,但这并不是必须的,其必要条 件是序列中至少有一个可迭代(Iterable)对象,包括但不限于字符串、字典、列表。对于一个可迭代对象, string 类型的 str 对象和 object 类型的 str 对象返回结果可能是不同的。
2 正则表达式基础
2.1 一般字符的匹配
正则表达式是一种按照某种正则模式,从左到右匹配字符串中内容的一种工具。对于一般的字符而言,它可 以找到其所在的位置,这里为了演示便利,使用了 python 中 re 模块的 findall 函数来匹配所有出现过但不重 叠的模式,第一个参数是正则表达式,第二个参数是待匹配的字符串。
3 文本处理的五类操作
3.1 拆分
str.split 能够把字符串的列进行拆分,其中第一个参数为正则表达式,可选参数包括从左到右的最大拆分次 数 n ,是否展开为多个列 expand 。
与其类似的函数是 str.rsplit ,其区别在于使用 n 参数的时候是从右到左限制最大拆分次数。但是当前版本 下 rsplit 因为 bug 而无法使用正则表达式进行分割:
3.2 合并
关于合并一共有两个函数,分别是 str.join 和 str.cat 。str.join 表示用某个连接符把 Series 中的字符串列表
连接起来,如果列表中出现了字符串元素则返回缺失值
str.cat 用于合并两个序列,主要参数为连接符 sep 、连接形式 join 以及缺失值替代符号 na_rep ,其中连接 形式默认为以索引为键的左连接
3.3 匹配
str.contains 返回了每个字符串是否包含正则模式的布尔序列
str.startswith 和 str.endswith 返回了每个字符串以给定模式为开始和结束的布尔序列,它们都不支持正则表 达式
如果需要用正则表达式来检测开始或结束字符串的模式,可以使用 str.match ,其返回了每个字符串起始处 是否符合给定正则模式的布尔序列
当然,这些也能通过在 str.contains 的正则中使用 ^ 和 $ 来实现
除了上述返回值为布尔的匹配之外,还有一种返回索引的匹配函数,即 str.find 与 str.rfind ,其分别返回从左 到右和从右到左第一次匹配的位置的索引,未找到则返回-1。需要注意的是这两个函数不支持正则匹配,只 能用于字符子串的匹配
3.4 替换
str.replace 和 replace 并不是一个函数,在使用字符串替换时应当使用前者。
当需要对不同部分进行有差别的替换时,可以利用 子组 的方法,并且此时可以通过传入自定义的替换函数 来分别进行处理,注意 group(k) 代表匹配到的第 k 个子组(圆括号之间的内容)
3.5 提取
提取既可以认为是一种返回具体元素(而不是布尔值或元素对应的索引位置)的匹配操作,也可以认为是一 种特殊的拆分操作。前面提到的 str.split 例子中会把分隔符去除,这并不是用户想要的效果,这时候就可以 用 str.extract 进行提取
通过子组的命名,可以直接对新生成 DataFrame 的列命名
str.extractall 不同于 str.extract 只匹配一次,它会把所有符合条件的模式全部匹配出来,如果存在多个结果, 则以多级索引的方式存储
4 常用字符串函数
除了上述介绍的五类字符串操作有关的函数之外,str 对象上还定义了一些实用的其他方法
4.1 字母型函数
upper, lower, title, capitalize, swapcase 这五个函数主要用于字母的大小写转化
4.2 数值型函数
这里着重需要介绍的是 pd.to_numeric 方法,它虽然不是 str 对象上的方法,但是能够对字符格式的数值进 行快速转换和筛选。其主要参数包括 errors 和 downcast 分别代表了非数值的处理模式和转换类型。其中, 对于不能转换为数值的有三种 errors 选项,raise, coerce, ignore 分别表示直接报错、设为缺失以及保持原来 的字符串
在数据清洗时,可以利用 coerce 的设定,快速查看非数值型的行
4.3 统计型函数
count 和 len 的作用分别是返回出现正则模式的次数和字符串的长度
4.4 格式型函数
格式型函数主要分为两类,第一种是除空型,第二种时填充型。其中,第一类函数一共有三种,它们分别是 strip, rstrip, lstrip ,分别代表去除两侧空格、右侧空格和左侧空格。这些函数在数据清洗时是有用的,特别 是列名含有非法空格的时候
对于填充型函数而言,pad 是最灵活的,它可以选定字符串长度、填充的方向和填充内容
上述的三种情况可以分别用 rjust, ljust, center 来等效完成,需要注意 ljust 是指右侧填充而不是左侧填充
在读取 excel 文件时,经常会出现数字前补 0 的需求,例如证券代码读入的时候会把”000007”作为数值 7 来处理,pandas 中除了可以使用上面的左侧填充函数进行操作之外,还可用 zfill 来实现
网友评论