Pandas 字符串操作

1. 前言

上一节我们学习了 Pandas 对于数值数据排序和排名操作,除了数值数据之外,字符串数据也是我们数据处理和分析中最常见到的数据之一,而对于字符串的处理成为了我们数据处理中一个重要的工作,Pandas 作为专业的数据处理分析工具,早就为用户封装好了各种字符串操作的函数,极大的提高了字符串处理的便捷和效率,接下来我们将打开 Pandas 字符串操作的大门,一起学习丰富且强大的字符串操作。

2. Pandas 字符串操作

Pandas 对字符串的操作是基于 Series 对象的 str 属性,该属性表示就是字符串对象,他下面封装了多种字符串操作函数,正是通过这些函数,我们可以方便的处理字符串,值得注意的是,Pandas 中的这些操作函数是单独封装的,实现上不同于 python 语言自带的字符串操作函数,使用起来更加的便捷,效率也更高。另外,Pandas 的 DataFrame 数据对象是不含该属性的,因此也不具有相应的字符串操作函数,但是我们在实际应用中,往往会根据需要获取 DataFrame 的数据子集返回 Series 数据对象,在通过 str 属性进行字符串的操作。

Pandas 中提供了大量的字符串操作方法,我们这里依据是否影响字符串长度或内容,选取了 Pandas 库中常用的一些字符串操作函数进行详细讲解。

**Tips:** 字符串中的操作函数,是区分大小写的,这点在使用时要注意。

在讲解之前,我们还是先把 Excel 中的数据做一下处理,方便我们后面各个函数操作效果的呈现。
图片描述

解析后输出的数据结果:

图片描述

2.1 影响字符串长度或内容的函数

序号 函数 说明
1 str.split() 拆分字符串
2 str.slice() 按给定的位置截取字符串
3 str.strip() 删除字符串中的空格或者换行符
4 str.lower() 将字符串转换为小写
5 str.upper() 将字符串转换为大写
6 str.cat() 连接字符串列
7 str.replace() 替换字符串中的元素
8 str.swapcase() 字符串中的大小写互换

下面我们将通过代码操作详细介绍这几个函数的使用方法:

1. split() 函数

该函数根据指定的元素分割字符串。

# 导入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第16小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)
# --- 输出结果 ---
             编程语言     推出时间    价格          主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# split() 函数
new_series=data["编程语言"]
split_res= new_series.str.split("@")
print(split_res)
# --- 输出结果 ---
0               [java]
1    [python, 163.com]
2                  [C]
3         [js, qq.com]
4                [php]
5        [C++        ]
Name: 编程语言, dtype: object

结果解析:首先我们获得 DataFrame 的 “编程语言” 列,返回的数据结构为 Series ,我们通过 str 属性的 split () 函数,传入分割依据的字符,通过结果可以看到,存在 @ 字符的字符串均被分割成了多个子元素,返回结果也是由列表构成的 Series 数据集。

2. slice() 函数

该函数根据给定开始和结束的下标位置,截取字符串,注意是左闭右开,不包含右边的下标位置,该函数有三参数:

  • start :开始下标
  • stop :结束下标
  • step :步长
# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格            主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustru

# data 解析出来的数据
# slice() 函数
new_series=data["编程语言"]
slice_res= new_series.str.slice(2,4)
print(slice_res)
# --- 输出结果 ---
0    va
1    th
2      
3    @q
4     p
5    + 
Name: 编程语言, dtype: object

结果解析:这里我们指定 "编程语言" 列每个字符串从下标 2 截取到下标 4,因为下标是从 0 开始的,因此也就是截取每个字符串中第 3 和第 4 个字符,可以看到每个输出的结果。

3. strip() 函数

该函数会去掉字符串中头和尾的空格已经换行符。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格            主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustru

# data 解析出来的数据
# strip() 函数
new_series=data["编程语言"]
slice_res= new_series.str.strip()
print(slice_res)
# --- 输出结果 ---
0              java
1    python@163.com
2                 C
3         js@qq.com
4               php
5               C++
Name: 编程语言, dtype: object

结果解析:通过输出结果可以看到,“C++” 中原数据后面有空格在,使用函数操作后,空格被删除。

4. lower() 函数

该函数用于将字符串中的所有大写字母转换为小写字母。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格            主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustru

# data 解析出来的数据
# lower() 函数
new_series=data["编程语言"]
slice_res= new_series.str.lower() 
print(slice_res)
# --- 输出结果 ---
0              java
1    python@163.com
2                 c
3         js@qq.com
4               php
5       c++        
Name: 编程语言, dtype: object

结果解析:通过输出结果可以看到,“编程语言” 列所有的大写字母都转换成了小写。

5. upper() 函数

该函数用于将字符串中的所有小写字母转换为大写字母。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格            主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustru

# data 解析出来的数据
# upper() 函数
new_series=data["编程语言"]
slice_res= new_series.str.upper() 
print(slice_res)
# --- 输出结果 ---
0              JAVA
1    PYTHON@163.COM
2                 C
3         JS@QQ.COM
4               PHP
5       C++        
Name: 编程语言, dtype: object

结果解析:通过输出结果可以看到,"编程语言" 这一列所有的小写字母均转换为了大写字母。

6. cat() 函数

该函数用于将两列合并成一列数据,前提是两列都是字符,如果是数值的话会报错。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格                       主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# cat() 函数
new_series=data["编程语言"]
new_series_two=data["主要创始人"]
slice_res= new_series.str.cat(new_series_two) 
print(slice_res)
# --- 输出结果 ---
0                   javaJames Gosling
1    python@163.comGuido van Rossum\n
2         CDennis MacAlistair Ritchie
3               js@qq.comBrendan Eich
4                   phpRasmus Lerdorf
5        C++        Bjarne Stroustrup
Name: 编程语言, dtype: object

结果解析:通过 cat () 函数,将 “编程语言” 和 “主要创始人” 两列进行合并,可以看到输出结果中的合并结果。

7. replace() 函数

该函数可用于替换字符串的内容。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格                       主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# replace() 函数
new_series=data["编程语言"]
slice_res= new_series.str.replace("com","cn") 
print(slice_res)
# --- 输出结果 ---
0             java
1    python@163.cn
2                C
3         js@qq.cn
4              php
5      C++        
Name: 编程语言, dtype: object
      

结果解析:这里我们将 “编程语言” 列字符串中的 com 替换为 cn,通过输出结果可以看到替换的效果。

8. swapcase() 函数

该函数用于将字符串中的大小写进行相互转换(大写转换为小写,小写转换为大写)。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格            主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# swapcase() 函数
new_series=data["主要创始人"]
slice_res= new_series.str.swapcase() 
print(slice_res)
# --- 输出结果 ---
0                 jAMES gOSLING
1            gUIDO VAN rOSSUM\n
2    dENNIS mACaLISTAIR rITCHIE
3                  bRENDAN eICH
4                rASMUS lERDORF
5             bJARNE sTROUSTRUP
Name: 主要创始人, dtype: object
   

结果解析:这里我们通过 swapcase 函数将 “主要创始人” 列中字符串的大小写进行了互换,通过输出结果可以看到互换的效果。

2.2 不影响字符串长度或内容的函数

序号 函数 说明
1 str.len() 计算字符串的长度
2 str.contains() 查询字符串是否包含某个字符或子字符串
3 str.find() 查询元素第一次在字符串中出现的位置
4 str.count() 查询某个元素出现的次数
5 str.startswith() 查询字符串是否以某个元素开头
6 str.endswith() 查询字符串是否以某个元素结尾
7 str.istitle() 查询字符串是否首字母大写其他都是小写

下面我们将通过代码操作详细介绍这几个函数的使用方法:

1. len() 函数

该函数用于返回字符串的的长度,包括空格和回车符。

# 导入pandas包
import pandas as pd
data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第16小节/execl数据demo.xlsx"
# 解析数据
data = pd.read_excel(data_path)
print(data)
# --- 输出结果 ---
             编程语言     推出时间    价格                       主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# len() 函数
new_series=data["主要创始人"]
slice_res= new_series.str.len() 
print(slice_res)
# --- 输出结果 ---
0    13
1    17
2    26
3    12
4    14
5    17
Name: 主要创始人, dtype: int64

结果解析:通过该函数可以输出字符串的长度,“主要创始人” 列的第二个字符加上空格和回车符工 17 个字符,如果字符前后存在空格,也是加入计算的。

2. contains() 函数

该函数用于检测字符串是否包含某个字符或者是子串,返回值为布尔型。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格                       主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# contains() 函数
new_series=data["编程语言"]
slice_res= new_series.str.contains("com") 
print(slice_res)
# --- 输出结果 ---
0    False
1     True
2    False
3     True
4    False
5    False
Name: 编程语言, dtype: bool

结果解析:通过该函数检测 “编程语言” 列,字符串是否含有子串 com ,该列只有第 2 行和第 4 行含有 com 子串,所以这两行的检测结果为 True,其他行为 False。

3. find() 函数

该函数用于检测字符串中第一次出现某个子串或者字符的下标位置,如果不存在则返回为 -1。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格                       主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# find() 函数
new_series=data["编程语言"]
slice_res= new_series.str.find("com") 
print(slice_res)
# --- 输出结果 ---
0    -1
1    11
2    -1
3     6
4    -1
5    -1
Name: 编程语言, dtype: int64
       

结果解析:通过该函数进行检测,可以看到 “编程语言” 列中字符串出现 com 子串的位置下标,第 2 行为 11,第 4 行为 6,其他行因为不存在该子串,所以返回 - 1。

4. count() 函数

该函数用于统计字符串中出现某个子串或者字符的次数。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格                       主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# count() 函数
new_series=data["编程语言"]
slice_res= new_series.str.count("o") 
print(slice_res)
# --- 输出结果 ---
0    0
1    2
2    0
3    1
4    0
5    0
Name: 编程语言, dtype: int64
       

结果解析:通过该函数检测 “编程语言” 列,各个字符串中出现字符 ‘o’ 的次数,通过输出结果可以看到每一个子串中该字符出现的次数。

5. startswith() 函数

该函数用于检测字符串是否以某个字符或者子串开始,返回结果为布尔型。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格          主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# startswith() 函数
new_series=data["编程语言"]
slice_res= new_series.str.startswith("j") 
print(slice_res)
# --- 输出结果 ---
0     True
1    False
2    False
3     True
4    False
5    False
Name: 编程语言, dtype: bool

结果解析:通过该函数,检测 “编程语言” 列各个字符串是否以字符 ‘j’ 开始,可以看到输出结果只有第 1 行和第 4 行是的。

6. endswith() 函数

该函数用于检测字符串是否以某个字符或者子串结尾,返回结果为布尔型。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格          主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# endswith() 函数
new_series=data["编程语言"]
slice_res= new_series.str.endswith("p") 
print(slice_res)
# --- 输出结果 ---
0    False
1    False
2    False
3    False
4     True
5    False
Name: 编程语言, dtype: bool
# 结果解析:通过该函数对“编程语言”列的字符串进行检测,是否以字符 'p' 结尾,通过输出结果可以看到只有第5行的 "php" 是以该字符为结尾的,检测结果为 True 。        

7. istitle() 函数

该函数用于检测字符串中每个单词是否以大写字符开头,并且其他的字符均为小写的内容,这里要注意,检测的单位是字符串中的每个单词。

# --- 解析 data 数据结果 ---
             编程语言     推出时间    价格          主要创始人
0            java    199545.6               James Gosling
1  python@163.com    199167.0          Guido van Rossum\n
2               C    197233.9  Dennis MacAlistair Ritchie
3       js@qq.com    199559.5                Brendan Eich
4             php  2012年\n  69.9              Rasmus Lerdorf
5     C++            198375.0           Bjarne Stroustrup

# data 解析出来的数据
# istitle() 函数
new_series=data["主要创始人"]
slice_res= new_series.str.istitle() 
print(slice_res)
# --- 输出结果 ---
0     True
1    False
2    False
3     True
4     True
5     True
Name: 主要创始人, dtype: bool

结果解析:通过该函数检测 “主要创始人” 列中各个字符串的每个单词是否以大写字母开头,该单词的其他字符为小写,因为第 2 行字符串的 “van” 单词不是以大写字母开头,所有为 False,第 3 行字符串的 “MacAlistair” 虽然是以大写字符开头,但是该单词的其他字符不全是小写,因此也是返回 False 。

3. 小结

本节课程我们主要学习了 Pandas 库对于字符串的操作处理,Pandas 库提供了大量的字符串操作函数,我们这节课只是学习了部分常用的函数使用方法和注意事项,大家可以参考 Pandas 开发文档,了解 pandas 库提供的其他的字符串操作函数(开发文档) 。本节课程的重点如下:

  • Pandas 库常用的字符串操作函数的使用和注意事项。

图片描述