拆分、拼接、替换、提取和匹配是pandas关于文本数据的五种常用操作。五种操作相辅相成,共同撑起了pandas文本数据处理能力。
一、拆分str.split
str.split方法可以指定某一种特定的符号作为分割符,比如“_”,默认一般为空格。需要注意的是split后的类型是object,因为现在Series中的元素已经不是string,而包含了list,且string类型只能含有字符串。对于str方法可以进行元素的选择,如果该单元格元素是列表,那么str[i]表示取出第i个元素,如果是单个元素,则先把元素转为列表在取出。比如,对列表s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")使用s.str.split('_').str[1]输出结果为:
0 b
1 d
2 <NA>
3 g
dtype: object
此外,该方法还有两个参数:expand和n。其中,expand参数控制了是否将列拆开,n参数代表最多分割多少次。
最后,关于分割的还有一个rsplit方法,该方法表示从右边分割,而split()表示从左边开始分割。两者分割后的结构均为一个列表。
二、拼接str.cat
cat方法对于不同对象的作用结果并不相同,其中的对象包括:单列、双列、多列。对于单个Series而言,就是指所有的元素进行字符合并为一个字符串。对于两个Series合并而言,是对应索引的元素进行合并。多列拼接可以分为表的拼接和多Series拼接。需要注意的是,对于多个series拼接,是按照索引的拼接。比如:
s1=pd.Series(list(‘abc’),index=[0,1,2])
s2=pd.Series(list(‘bcd’),index=[1,2,3])
调用s1.str.cat(s2)输出结果为:
- a
- bb
- cc
三、替换 str.replace
首先,要区别str.replace和replace两种方法。str.replace针对的是object类型或string类型,默认是以正则表达式为操作,目前暂时不支持DataFrame上使用。replace针对的是任意类型的序列或数据框,如果要以正则表达式替换,需要设置regex=True,该方法通过字典可支持多列替换。
四、提取str.extract
该方法有一个默认参数expand,一般默认为true。对于一个子组的Series,如果expand设置为False,则返回Series,若大于一个子组,则expand参数无效,全部返回DataFrame。对于一个子组的Index,如果expand设置为False,则返回提取后的Index,若大于一个子组且expand为False,报错。
此外,可用于提取的还有extractall方法。该方法与extract只匹配第一个符合条件的表达式不同,extractall会找出所有符合条件的字符串,并建立多级索引(即使只找到一个)。比如,对于s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"],dtype="string")用该方法,two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])',输出结果为:
letter digit
match
A 0 a 1
1 a 2
B 0 b 1
C 0 c 1
五、匹配str.contains和str.match
str.contains作用为检测是否包含某种正则模式,可选参数为na。str.match与其区别在于,match依赖于python的re.match,检测内容为是否从头开始包含该正则模式。