看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
对文本的分隔和替换是最常用的文本处理方式。对文本分隔后会生成一个列表,我们对列表进行切片操作,可以找到我们想要的内容,分隔后还可以将分隔内容展开,形成单独的行。
下例对内容中的下划线进行了分隔,分隔后每个内容都成为了一个列表,其中对空值是不起作用的。
s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")
s2.str.split('_')
'''
0 [a, b, c]
1 [c, d, e]
2 <NA>
3 [f, g, h]
dtype: object
'''
分隔后可以使用 get
或者 []
来取出相应内容,不过 []
是列表切片操作更加灵活,不仅可以取出单个内容,也可以取出多个内容组成的片断。
# 取出每行第二个,列表索引从 0 开始
s2.str.split('_').str[1]
# get 只能传一个值
s2.str.split('_').str.get(1)
'''
0 b
1 d
2 <NA>
3 g
dtype: object
'''
# [] 可以使用切片操作
s2.str.split('_').str[1:3]
s2.str.split('_').str[:-2]
# 如果不指定分隔符,会按空格进行分隔
s2.str.split()
# 限制分隔的次数,从左开始,剩余的不分隔
s2.str.split(n=2)
使用 split 可以将分隔后的数据展开形成新的行内容。
s2.str.split('_', expand=True)
'''
0 1 2
0 a b c
1 c d e
2 <NA> <NA> <NA>
3 f g h
'''
# 指定展开列数,n 为切片右值
s2.str.split('_', expand=True, n=1)
'''
0 1
0 a b_c
1 c d_e
2 <NA> <NA>
3 f g_h
'''
rsplit
和 split
一样,只不过它是从右边开始分隔,如果没有n参数,rsplit和split的输出是相同的。
s2.str.rsplit('_', expand=True, n=1)
'''
0 1
0 a_b c
1 c_d e
2 <NA> <NA>
3 f_g h
'''
对于规则比较复杂的,分隔符处可以传入正则表达式:
s = pd.Series(["1+1=2"])
s.str.split(r"\+|=", expand=True)
'''
0 1 2
0 1 1 2
'''
可以使用 .str.slice()
将指定的内容切除掉,不过还是推荐使用 s.str[]
来实现,这样我们只学一套内容就可以了 :
s = pd.Series(["koala", "fox", "chameleon"])
'''
0 koala
1 fox
2 chameleon
dtype: object
'''
s.str.slice() # 不做任何事
s.str.slice(1) # 切掉第一个字符
s.str.slice(start=1)
'''
0 oala
1 ox
2 hameleon
dtype: object
'''
# 切除最后一个以前的,留下最后一个
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)
.str.partition
可以将文本按分隔符号划分为三个部分,形成一个新的 DataFrame或者相关数据类型。
s = pd.Series(['Linda van der Berg', 'George Pitt-Rivers'])
s.str.partition()
'''
0 1 2
0 Linda van der Berg
1 George Pitt-Rivers
'''
# 从右开始划分
s.str.rpartition()
# 指定符号
s.str.partition('-')
# 划分为一个元组列
s.str.partition('-', expand=False)
# 对索引进行划分
idx = pd.Index(['X 123', 'Y 999'])
idx
# Index(['X 123', 'Y 999'], dtype='object')
更新时间:2020-05-25 17:35:50 标签:pandas 文本 分割