Python 数据处理(三十五)—— 文本数据处理

Python012

Python 数据处理(三十五)—— 文本数据处理,第1张

在 pandas 中,存储文本主要有两种方式

但一般建议使用 StringDtype 类型存储文本数据。都是由于各种原因,现在字符串数据的默认存储类型还是 object 。

要存储为 string 类型,需要显式的设置 dtype 参数

或者在创建 Series 或 DataFrame 之后,使用 astype 转换类型

也可以使用 StringDtype/"string" 转换其他非字符串类型的数据

转换现有数据的类型

StringDtype 类型对象与 object 类型之间存在一些差异

两个结果的输出都是 Int64 类型。将其与 object 类型比较

当存在 NA 值时,输出为 float64 。类似地,对于返回布尔值的方法

Series 和 Index 有一套字符串处理方法,可以方便地对数组的每个元素进行操作,最重要的是,这些方法会自动忽略缺失值。

这些方法可以通过 str 属性访问,通常具有与内置字符串方法相匹配的名称

Index 上的字符串方法对于清理或转换 DataFrame 的列特别有用。

例如,您可能有带有前导或后置空格的列

因为 df.columns 是一个 Index 对象,所以我们可以使用 .str 访问器

我们可以根据需要对列名进行处理,然后重新设置列名。

例如,我们删除列名的前后空格,并将其改为小写字母,同时用 _ 替换剩余的空格

split 方法会返回一个值为 list 的 Series

可以使用 get 或 [] 访问拆分后的列表中的元素

更简单的方法是设置 expand 参数,返回一个 DataFrame

当原来的 Series 包含 StringDtype 类型的数据时,输出列也将全部为 StringDtype

当然,也可以设置切割次数

它还有个对应的 rsplit 方法,从右边起始对字符串进行拆分

replace 参数支持使用正则表达式,前两个参数是 pat (匹配模式) 和 repl (替换字符串)

如果只是想要替换字符串字面值,可以将 regex 参数设置为 False ,而不需要对每个特殊字符进行转义。此时 pat 和 repl 参数必须是字符串

此外, replace 方法还接受一个可调用的替换函数,会使用 re.sub() 方法在每个匹配的模式上调用该函数

该函数需要传入一个正则对象作为位置参数,并返回一个字符串。例如

replace 方法的 pat 参数还接受 re.compile() 编译的正则表达式对象。所有的 flags 需要在编译正则对象时设置

如果在 replace 中设置 flags 参数,则会抛出异常

有几种方法可以将一个 Series 或 Index 与自己或其他的 Series 或 Index 相连接,所有这些方法都是基于 cat() 方法

可以连接一个 Series 或 Index 的内容

如果未指定 sep 参数,则默认为空字符串

默认会跳过缺失值,也可以使用 na_rep 指定缺失值的表示方式

cat() 的第一个参数 others 可以是类似列表的对象,但是其长度需要和调用对象一致

只要两个对象中存在缺失值,对应的结果中也是缺失值,除非指定了 na_rep

others 参数也可以是二维的,但是得保证其行数必须与调用的对象一致

对于 Series 或 DataFrame 的连接,可以通过设置 join 参数指定对齐方式

通常 join 可选范围为: 'left' , 'outer' , 'inner' , 'right' 。此时,不再要求两个对象长度一致

当 others 参数是 DataFrame 时,也可以使用

可以将一些类似数组的对象(如 Series , Index 等)放在一个类似列表的容器中,然后传递给 cat

对于没有索引的对象,其长度必须与调用 cat 的对象相同。但是 Series 和 Index 可以是任意的,除非设置了 json=None 。

如果在 others 参数上包含不同索引的对象,且设置了 join='right' ,则最后的结果将会是这些索引的并集

可以使用 [] 符号直接按位置进行索引,如果索引超过字符串的长度,结果将是 NaN

在 0.23 版本之前, extract 方法的参数 expand 默认为 False 。当 expand=False 时, expand 会根据正则表达式模式返回一个 Series 、 Index 或 DataFrame

当 expand=True 时,它总是返回一个 DataFrame ,这种方式更加符合用户的需求,从 0.23.0 版本开始就是默认的

extract 方法接受一个至少包含一个捕获组的正则表达式

如果是包含多个组的正则表达式将返回一个 DataFrame ,每个捕获组是一列

未匹配的行会填充 NaN ,可以从混乱的字符串序列中提取出有规则的信息。

对于命名分组

对于可选的分组

注意 :正则表达式中的任何捕获组名称都将用作列名,否则将使用捕获组号

如果 expand=True ,则返回一个 DataFrame

如果 expand=False ,则返回一个 Series

对于索引,如果 expand=True ,且只有一个捕获组则返回一个只有一列的 DataFrame

此时,如果 expand=False 将会返回一个 Index

对于索引,正则表达式设置多个分组将返回 DataFrame

如果 expand=False 将会抛出 ValueError 异常

对于 extract 只返回第一个匹配项

与 extract 不同, extractall 方法返回每个匹配项,其结果始终是具有 MultiIndex 的 DataFrame 。

MultiIndex 的最后一级名为 match ,标示的是匹配的顺序

对于只有一个匹配的 Series

extractall(pat).xs(0, level='match') 与 extract(pat) 的结果一致

Index 也支持 .str.extractall ,它返回一个 DataFrame ,其结果与 Series.str 相同。

您可以检查字符串元素中是否包含正则匹配模式

或者字符串元素是否与模式匹配

而在 1.1.0 版本中

注意 :

match 、 fullmatch 和 contains 之间的区别是:

这三个函数于 re 模块的 re.fullmatch 、 re.match 和 re.search 对应

像 match , fullmatch , contains , startswith 和 endswith 有一个额外的 na 参数,用于将缺失值替换为 True 或 False

您可以从字符串列中提取指标变量。例如,如果使用 '|' 分隔的字符串

字符串 Index 也支持 get_dummies ,它返回一个 MultiIndex