文本分隔
对文本的分隔和替换是最常用的文本处理方式。对文本分隔后会生成一个列表,我们对列表进行切片操作,可以找到我们想要的内容。分隔后还可以将分隔内容展开,形成单独的行。下例以下划线对内容进行了分隔,分隔后每个内容都成为一个列表。分隔对空值不起作用。
# 构造数据
s = pd.Series(['天_地_人', '你_我_他', np.nan, '风_水_火'], dtype="string")
s
'''
0 天_地_人
1 你_我_他
2 <NA>
3 风_水_火
dtype: string
'''
# 用下划线分隔
s.str.split('_')
'''
0 [天, 地, 人]
1 [你, 我, 他]
2 <NA>
3 [风, 水, 火]
dtype: object
'''
分隔后可以使用get或者[]来取出相应内容,不过[]是Python列表切片操作,更加灵活,不仅可以取出单个内容,也可以取出由多个内容组成的片段。
# 取出每行第二个
s.str.split('_').str[1]
# get只能传一个值
s.str.split('_').str.get(1)
'''
0 地
1 我
2 <NA>
3 水
dtype: object
'''
# []可以使用切片操作
s.str.split('_').str[1:3]
s.str.split('_').str[:-2]
# 如果不指定分隔符,会按空格进行分隔
s.str.split()
# 限制分隔的次数,从左开始,剩余的不分隔
s.str.split(n=2)
11.3.2 字符分隔展开
在用.str.split()将数据分隔为列表后,如果想让列表共同索引位上的值在同一列,形成一个DataFrame,可以传入expand=True,还可以通过n参数指定分隔索引位来控制形成几列,见下例:
# 分隔后展开为DataFrame
s.str.split('_', expand=True)
'''
0 1 2
0 天 地 人
1 你 我 他
2 <NA> <NA> <NA>
3 风 水 火
'''
# 指定展开列数,n为切片右值
s2.str.split('_', expand=True, n=1)
'''
0 1
0 天 地_人
1 你 我_他
2 <NA> <NA>
3 风 水_火
'''
rsplit和split一样,只不过它是从右边开始分隔。如果没有n参数,rsplit和split的输出是相同的。
# 从右分隔为两部分后展开为DataFrame
s.str.rsplit('_', expand=True, n=1)
'''
0 1
0 天_地 人
1 你_我 他
2 <NA> <NA>
3 风_水 火
'''
对于比较复杂的规则,分隔符处可以传入正则表达式:
# 数据
s = pd.Series(["你和我及他"])
# 用正则表达式代表分隔位
s.str.split(r"\和|及", expand=True)
'''
0 1 2
0 你 我 他
'''
11.3.3 文本切片选择
使用.str.slice()将指定的内容切除掉,不过还是推荐使用s.str[]来实现,这样我们只学一套内容就可以了:
s = pd.Series(["sun", "moon", "star"])
'''
0 sun
1 moon
2 star
dtype: object
'''
# 以下切掉第一个字符
s.str.slice(1)
s.str.slice(start=1)
'''
0 un
1 oon
2 tar
dtype: object
'''
以下是一些其他用法的示例:
s.str.slice() # 不做任何事
# 切除最后一个以前的,留下最后一个
s.str.slice(start=-1) # s.str[-1]
# 切除第二位以后的
s.str.slice(stop=2) # s.str[:2]
# 切除步长为2的内容
s.str.slice(step=2) # s.str[::2]
# 切除从头开始,第4位以后并且步长为3的内容
# 同s.str[0:5:3]
s.str.slice(start=0, stop=5, step=3)
11.3.4 文本划分
.str.partition可以将文本按分隔符号划分为三个部分,形成一个新的DataFrame或者相关数据类型。
# 构造数据
s = pd.Series(['How are you', 'What are you doing'])
'''
0 How are you
1 What are you doing
dtype: object
'''
# 划分为三列DataFrame
s.str.partition()
'''
0 1 2
0 How are you
1 What are you doing
'''
其他的操作方法如下:
# 从右开始划分
s.str.rpartition()
'''
0 1 2
0 How are you
1 What are you doing
'''
# 指定字符
s.str.partition("are")
'''
0 1 2
0 How are you
1 What are you doing
'''
# 划分为一个元组列
s.str.partition("you", expand=False)
'''
0 (How are , you, )
1 (What are , you, doing)
dtype: object
'''
# 对索引进行划分
idx = pd.Index(['A 123', 'B 345'])
idx.str.partition()
'''
MultiIndex([('A', ' ', '123'),
('B', ' ', '345')],
)
'''