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() | 字符串中的大小写互换 |
下面我们将通过代码操作详细介绍这几个函数的使用方法:
- 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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 数据集。
- slice() 函数
该函数根据给定开始和结束的下标位置,截取字符串,注意是左闭右开,不包含右边的下标位置,该函数有三参数:
- start :开始下标
- stop :结束下标
- step :步长
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 个字符,可以看到每个输出的结果。
- strip() 函数
该函数会去掉字符串中头和尾的空格已经换行符。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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++” 中原数据后面有空格在,使用函数操作后,空格被删除。
- lower() 函数
该函数用于将字符串中的所有大写字母转换为小写字母。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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
结果解析:通过输出结果可以看到,“编程语言” 列所有的大写字母都转换成了小写。
- upper() 函数
该函数用于将字符串中的所有小写字母转换为大写字母。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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
结果解析:通过输出结果可以看到,"编程语言" 这一列所有的小写字母均转换为了大写字母。
- cat() 函数
该函数用于将两列合并成一列数据,前提是两列都是字符,如果是数值的话会报错。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 () 函数,将 “编程语言” 和 “主要创始人” 两列进行合并,可以看到输出结果中的合并结果。
- replace() 函数
该函数可用于替换字符串的内容。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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,通过输出结果可以看到替换的效果。
- swapcase() 函数
该函数用于将字符串中的大小写进行相互转换(大写转换为小写,小写转换为大写)。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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() | 查询字符串是否首字母大写其他都是小写 |
下面我们将通过代码操作详细介绍这几个函数的使用方法:
- 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 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 个字符,如果字符前后存在空格,也是加入计算的。
- contains() 函数
该函数用于检测字符串是否包含某个字符或者是子串,返回值为布尔型。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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。
- find() 函数
该函数用于检测字符串中第一次出现某个子串或者字符的下标位置,如果不存在则返回为 -1。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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。
- count() 函数
该函数用于统计字符串中出现某个子串或者字符的次数。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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’ 的次数,通过输出结果可以看到每一个子串中该字符出现的次数。
- startswith() 函数
该函数用于检测字符串是否以某个字符或者子串开始,返回结果为布尔型。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 行是的。
- endswith() 函数
该函数用于检测字符串是否以某个字符或者子串结尾,返回结果为布尔型。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 。
- istitle() 函数
该函数用于检测字符串中每个单词是否以大写字符开头,并且其他的字符均为小写的内容,这里要注意,检测的单位是字符串中的每个单词。
# --- 解析 data 数据结果 ---
编程语言 推出时间 价格 主要创始人
0 java 1995年 45.6 James Gosling
1 python@163.com 1991年 67.0 Guido van Rossum\n
2 C 1972年 33.9 Dennis MacAlistair Ritchie
3 js@qq.com 1995年 59.5 Brendan Eich
4 php 2012年\n 69.9 Rasmus Lerdorf
5 C++ 1983年 75.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 库常用的字符串操作函数的使用和注意事项。