1. sci666首页
  2. 实用技巧
  3. 生物信息学

pandas中的字符串处理函数

在pandas中,通过DataFrame来存储文件中的内容,其中最常见的数据类型就是字符串了。针对字符串,pandas提供了一系列的函数,来提高操作效率。

这些函数可以方便的操作字符串类型的Series对象,对数据框中的某一列进行操作,这种向量化的操作提高了处理效率。pandas中的字符串处理函数以str开头,常用的有以下几种

1. 大小写转换

通过str.lower和str.upper来实现,用法如下

>>> df = pd.DataFrame(['A', 'B', 'C', 'D'])
>>> df
   0
0 A
1 B
2 C
3 D
>>> df[1] = df[0].str.lower()
>>> df[2] = df[1].str.upper()
>>> df
   0 1 2
0 A a A
1 B b B
2 C c C
3 D d D

 

2. 去除空白

和内置的strip系列函数相同,pandas也提供了一系列的去除空白函数,用法如下

>>> df = pd.DataFrame([' A', ' B', 'C ', 'D '])
>>> df
    0
0   A
1   B
2  C
3  D
# str.strip, 去除字符串前后两端的空白
>>> df[0].str.strip().array
<PandasArray>
['A', 'B', 'C', 'D']
Length: 4, dtype: object
# str.lstrip, 去除字符串前端的空白
>>> df[0].str.lstrip().array
<PandasArray>
['A', 'B', 'C ', 'D ']
Length: 4, dtype: object
# str.lstrip, 去除字符串后端的空白
>>> df[0].str.rstrip().array
<PandasArray>
[' A', ' B', 'C', 'D']
Length: 4, dtype: object
3. 拆分

通过str.split实现,可以指定拆分的次数,用法如下

>>> df = pd.DataFrame(['A_1_1', ' B_2_1', 'C_3_1', 'D_4_1'])
# 默认按照指定的分隔符进行拆分,结果为列表
>>> df[0].str.split('_')
0 [A, 1, 1]
1 [ B, 2, 1]
2 [C, 3, 1]
3 [D, 4, 1]
Name: 0, dtype: object

# n参数,指定分隔的次数
>>> df[0].str.split('_', n = 1)
0 [A, 1_1]
1 [B, 2_1]
2 [C, 3_1]
3 [D, 4_1]
Name: 0, dtype: object

# expand 参数默认为False, True表示返回值为数据框
>>> df[0].str.split('_', expand=True)
   0 1 2
0 A 1 1
1 B 2 1
2 C 3 1
3 D 4 1

4. 替换

通过str.replace来实现,通过正则表达式来进行全局替换,用法如下

>>> df = pd.DataFrame(['A_1_1', 'B_2_1', 'C_3_1', 'D_4_1'])
# 第一个参数为需要替换的值
# 第二个参数为替换后的值
>>> df[0].str.replace('_', '-')
0 A-1-1
1 B-2-1
2 C-3-1
3 D-4-1
Name: 0, dtype: object

# 用正则表达式来进行替换
>>> df[0].str.replace('[d_]+', '')
0 A
1 B
2 C
3 D
Name: 0, dtype: object

# regex参数的默认值为True, 表示第一个参数为正则表达式
# 当值为False时,表示第一个参数为常规的字符串
>>> df[0].str.replace('_', '-', regex=False)
0 A-1-1
1 B-2-1
2 C-3-1
3 D-4-1
Name: 0, dtype: object

5. 拼接

通过str.cat函数来实现,用法如下

>>> import pandas as pd
>>> df = pd.DataFrame(['A', 'B', 'C', 'D'])
>>> df
   0
0 A
1 B
2 C
3 D
# 单个Series对象,将所有数据拼接在一起
>>> df[0].str.cat()
'ABCD'
# sep参数制定分隔符
>>> df[0].str.cat(sep=',')
'A,B,C,D'

# 当两个数组拼接时,返回一个新的Series对象
>>> df[0].str.cat(['1','2', '3', '4'])
0 A1
1 B2
2 C3
3 D4
Name: 0, dtype: object

# 当拼接的对象为一个数据框时,将数据框的所有列都进行拼接
>>> df[1] = df[0].str.cat(['1','2', '3', '4'])
>>> df
   0 1
0 A A1
1 B B2
2 C C3
3 D D4
>>> df[0].str.cat(df)
0 AAA1
1 BBB2
2 CCC3
3 DDD4
Name: 0, dtype: object

6. 判断是否包含子字符串

通过str.contain函数来实现局部查找,类似re.search函数,用法如下

>>> df = pd.DataFrame(['A_1_1', 'B_2_1', 'C_3_1', 'D_4_1'])
>>> df
       0
0  A_1_1
1  B_2_1
2  C_3_1
3  D_4_1

>>> df[0].str.contains('1')
0    True
1    True
2    True
3    True
Name: 0, dtype: bool

>>> df[0].str.contains('w+')
0    True
1    True
2    True
3    True
Name: 0, dtype: bool
用str.match函数来实现从头开始的全局查找,类似re.match函数,用法如下
>>> df[0].str.match('1')
0    False
1    False
2    False
3    False
Name: 0, dtype: bool

>>> df[0].str.match('w+')
0    True
1    True
2    True
3    True
Name: 0, dtype: bool

7. 提取子字符串

通过str.extract和str.extractall函数来实现,用法如下

>>> df = pd.DataFrame(['A_1_1', 'B_2_1', 'C_3_1', 'D_4_1'])
>>> df
       0
0  A_1_1
1  B_2_1
2  C_3_1
3  D_4_1

# extract函数只提取一次符合匹配模式的字符串
>>> df[0].str.extract(r'(w)_(d)')
   0  1
0  A 1
1  B 2
2  C 3
3  D 4
# 用下述写法指定数据框的表头
>>> df[0].str.extract(r'(?P<letter>w)_(?P<digist>d)')
  letter digist
0      A 1
1      B 2
2      C 3
3      D 4
# extractall提取一个字符串中所有符合模式的字符串
# 返回值为一个行为多重索引的数据框
# match表示匹配的顺序,从0开始计数
>>> df[0].str.extractall(r'(?P<letter>w)_(?P<digist>d)')
        letter digist
  match
0 0          A 1
1 0          B 2
2 0          C 3
3 0          D 4

以上是部分常用的字符串函数,完整的字符串处理函数请查看官方的API文档。

这些可能会帮助到你: 问答社区 | 共享百度SVIP | 留言建议

欢迎入群交流:生信分析群: 732179952 · Meta分析群: 797345521 · 医学科研交流群: 797345521

发表评论

登录后才能评论