本文示例代码及文件已上传至Github仓库:https://github.com/CNFeffery/DataScienceStudyNotes
在日常开展数据分析的过程中,我们经常需要对字符串类型数据进行处理,此类过程往往都比较繁琐,而pandas
作为表格数据分析利器,其内置的基于Series.str
访问器的诸多针对字符串进行处理的方法,以及一些top-level
级的内置函数,则可以帮助我们大大提升字符串型数据处理的效率。
本文我就将带大家学习pandas
中常用的一些高效字符串处理方法,提升日常数据处理分析效率:
pandas
中的常用字符串处理方法,可分为以下几类:
这一类方法主要是基于原有的Series
数据,按照一定的规则,利用拼接或映射等方法合成出新的Series
,主要有:
当原有的Series
中每个元素均为列表,且列表中元素均为字符串时,就可以利用str.join()
来将每个列表按照指定的连接符进行连接,主要参数有:
「sep:」 str型,必选,用于设置连接符
它除了可以简化我们常规使用apply()
配合'连接符'.join(列表)
实现的等价过程之外,还可以在列表中包含非字符型元素时自动跳过此次拼接返回缺失值,譬如下面的例子:
s = pd.Series([
['a', 'b', 'c'],
[1, 'a', 'b'],
list('pandas')
])
s.str.join('-')
当需要对整个序列进行拼接,或者将多个序列按位置进行元素级拼接时,就可以使用str.cat()
方法来加速这个过程,其主要参数有:
「others:」 序列型,可选,用于传入待进行按位置元素级拼接的字符串序列对象
「sep:」 str型,可选,用于设置连接符,默认为''
「na_rep:」 str型,可选,用于设置对缺失值的替换值,默认为None
时:
当others
参数未设置时,返回的拼接结果中缺失项自动跳过
当others
参数设置时,两边的序列对应位置上存在缺失值时,拼接结果对应位置返回缺失值
下面是一些简单的例子:
判断类方法在这里指的是针对字符型Series
,按照一定的条件判断从而返回与原序列等长的bool
型序列,可进一步辅助数据筛选等操作,在pandas
中此类字符串处理方法主要有:
当我们需要判断字符型Series
中的每个元素是否以某段字符片段开头或结尾时,就可以使用到startswith()
/endswith()
,它们的参数一致:
「pat:」 str型,用于定义要检查的字符片段
「na:」 任意对象,当对应位置元素为空值时,用于自定义该位置返回判断结果,默认为NaN
,会原值返回,通常建议设置为False
下面是一些简单的例子:
当我们想要判断字符型Series
中每个元素,是否包含指定的字符片段或正则模式时,则可以使用到str.contains()
方法,其主要参数有:
「pat:」 str型,必选,用于定义要检查的字符模式,当regex=True
时表示正则表达式,当regex=False
时,表示原始字符串片段
「flags:」 int型,可选,对应re
模块中的flags
参数,用于配合正则表达式模式,实现更多功能,譬如re.IGNORECASE
即代表大小写忽略
「na:」 用于自定义遇到缺失值时返回的对象,通常建议设置为False
「regex:」 bool型,用于设置是否将pat
参数视为正则表达式进行解析,默认为True
下面是一些简单的例子:
类似前面介绍的startswith()
,不同的是,match()
支持正则表达式,可以帮助掌握正则表达式的用户拓展匹配能力,其主要参数有:
「pat:」 str型,必选,用于定义要检查的字符模式,当regex=True
时表示正则表达式,当regex=False
时,表示原始字符串片段
「flags:」 int型,可选,对应re
模块中的flags
参数,用于配合正则表达式模式,实现更多功能,譬如re.IGNORECASE
即代表大小写忽略
「na:」 用于自定义遇到缺失值时返回的对象,通常建议设置为False
下面是一些简单的例子:
上面介绍的match()
局限性在于只能从开头匹配是否满足指定正则表达式,而从pandas
1.1.0版本开始,新增了fullmatch()
方法,可以帮助我们传入正则表达式来判断目标字符串是否可以「完全匹配」,其参数同match()
,下面是一个简单的例子:
「生成型」方法这里指的是,基于原有的单列字符型Series
数据,按照一定的规则产生出新计算结果的一系列方法,pandas
中常用的有:
当我们想要对字符型Series
进行元素级的切片操作时,就可以用到str.slice()
,其三个参数依次为start
、stop
和step
,分别代表切片的开始下标、结束下标与步长,与Python
原生的切片方式一致,下面是一些简单的例子(也可以直接使用类似Python
中[start:stop:step]
):
当我们希望对字符型Series
进行元素级的字符片段/正则模式替换时,就可以使用到str.replace()
方法,其除了常规的pat
、flags
、regex
等参数外,还有特殊的参数n
用于设置每个元素字符串(默认为-1
即不限制次数),参数repl
用于设置填充的新内容,从开头开始总共替换几次,下面是一些简单的例子:
利用str.split()
方法,我们可以基于指定的字符片段或正则模式对原始字符Series
进行元素级拆分,主要参数有pat
、n
,同上文类似的参数设定,另外还有特殊参数expand
来设定对于是否以DataFrame
中不同列的形式存储拆分结果,默认为False
。下面是一些简单的例子:
利用findall()
,可以按照指定的字符片段/正则模式对字符型Series
进行元素级提取,可用的参数有pat
、flags
,下面是一些简单的例子:
通过count()
,我们可以对指定的字符片段/正则模式在字符型Series
中每个字符串元素中出现的次数进行统计,其参数同上文中的findall()
,下面是一些简单的例子:
除了上述介绍到的字符串处理方法外,pandas
中还有一些特殊方法,可以配合字符串解决更多处理需求,典型的有:
在涉及到机器学习特征工程的过程中,我们可以使用到str.get_dummies()
方法来对具有固定分隔符的字符串进行哑变量的生成,它只有一个参数sep
,用于设置分隔符,暂时不支持正则模式:
有些情况下,我们从外部数据源(如excel表)中读入的数据,由于原始数据文件加工的问题,导致一些数值型字段中的某些单元格混入非数值型字符,如:
这种情况下,直接读入的数据,本应该为数值型的字段会变成object
型:
这种时候就可以利用pd.to_numeric()
方法,设置参数errors='coerce'
,就可以将可以合法转为数值型的记录转换为相应的数值,不合法的位置返回缺失值: