跳到主要内容

Pandas 字符串操作

1. 前言

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

2. Pandas 字符串操作

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

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

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

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

图片描述

解析后输出的数据结果:

图片描述

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

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

  1. 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 个字符,可以看到每个输出的结果。

  1. 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++” 中原数据后面有空格在,使用函数操作后,空格被删除。

  1. 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


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

  1. 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


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

  1. 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 () 函数,将 “编程语言” 和 “主要创始人” 两列进行合并,可以看到输出结果中的合并结果。

  1. 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,通过输出结果可以看到替换的效果。

  1. 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 不影响字符串长度或内容的函数

序号函数说明
1str.len()计算字符串的长度
2str.contains()查询字符串是否包含某个字符或子字符串
3str.find()查询元素第一次在字符串中出现的位置
4str.count()查询某个元素出现的次数
5str.startswith()查询字符串是否以某个元素开头
6str.endswith()查询字符串是否以某个元素结尾
7str.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 个字符,如果字符前后存在空格,也是加入计算的。

  1. 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。

  1. 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。

  1. 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’ 的次数,通过输出结果可以看到每一个子串中该字符出现的次数。

  1. 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 行是的。

  1. 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 。

  1. 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 库常用的字符串操作函数的使用和注意事项。

图片描述