点击上方“萝卜大杂烩”,选择“星标”公众号
超级无敌干货,第一时间送达!!!
❝
文末送书,不要错过哦~
本文给大家介绍的是如何使用Pandas来操作字符串数据。
字符串是一种常见的数据类型,我们遇到的文本、json数据等都是属于字符串的范畴。Python内置了很多处理字符串的方法,这些方法为我们处理和清洗数据提供了很大的便利。
python内置方法
# 1、自定义字符串
x = "hello python!"
x'hello python!'
查看x的类型:
type(x) # str类型
str
# 2、字符串拼接
y = x + " hello pandas!" # 拼接x和hello pandas! 赋值给y
y'hello python! hello pandas!'
# 3、字符串大小写转化
y_upper = y.upper()
y_upper'HELLO PYTHON! HELLO PANDAS!'
y_lower = y_upper.lower()
y_lower'hello python! hello pandas!'
# 4、字符串替换
y.replace('p','P') # 小写p用大写P替换'hello Python! hello Pandas!'
# 5、字符串切割
y.split(" ") # 返回的是列表形式;里面就是切割后的每个元素['hello', 'python!', 'hello', 'pandas!']
# 6、字符串去除空白
"".join(y.split())'hellopython!hellopandas!'
# 7、包含与否
"m" in yFalse
"p" in y
True
还可以正则模块re来处理字符串相关的问题(不展开)。
Python内置的字符串处理方法只能处理一个字符串,如果想要同时处理,可以使用:
-
for循环,通过遍历列表来实现 -
python列表推导式来实现
a = ["python","java","c"]
a
['python', 'java', 'c']
# 遍历循环实现
for i in a:
print(f"The lenght of {i}: ", len(i))
The lenght of python: 6
The lenght of java: 4
The lenght of c: 1
# 列表推导式
[len(i) for i in a]
[6, 4, 1]
但是python内置的方法存在一个问题,不能处理缺失值:
b = ["python","java","c", None] # 存在缺失值
b
['python', 'java', 'c', None]
# [len(i) for i in b] # 运行报错
Pandas字符串类型
Pandas中存在两种字符串类型:ObjectDtype类型和StringDtype类型。关于StringDtype类型,官方有说明:
StringDtype is considered experimental. The implementation and parts of the API may change without warning.
中文翻译过来就是:StringDtype类型是实验性的。它的实现和部分API功能可能在未告知的情况下删除。
import pandas as pd
Pandas改变Object数据类型
Object类型是我们在pandas中常用的字符串类型。
astype指定类型
s = pd.Series(['a','b','c',None])
s
0 a
1 b
2 c
3 None
dtype: object
上面表示的是Pandas中字符或者字符与其他类型(案例是None)的混合类型。
s.dtype
dtype('O')
s1 = s.astype("string") # 通过astype强制转化成string
s1
0 a
1 b
2 c
3 <NA>
dtype: string
上面表示的是pandas的“纯“字符类型”。
s1.dtype
string[python]
在创建Series的时候可以直接指定数据类型:
s2 = pd.Series(['a','b','c',None], dtype='string')
s2
0 a
1 b
2 c
3 <NA>
dtype: string
s2.dtype
string[python]
convert_dtypes转化数据类型
df = pd.DataFrame(['1','2','3',None],
columns=['A'])
df
A | |
---|---|
0 | 1 |
1 | 2 |
2 | 3 |
3 | None |
df.dtypes
A object
dtype: object
df = df.convert_dtypes()
df.dtypes
A string
dtype: object
Pandas向量化操作字符串
使用字符串的str属性
Pandas中内置了等效python的字符串操作方法:str属性
df = pd.DataFrame(["Python Gudio 1991","Java Gosling 1990",None, "Pandas Mckinney 2008"],
columns=["Language"]
)
df
Language | |
---|---|
0 | Python Gudio 1991 |
1 | Java Gosling 1990 |
2 | None |
3 | Pandas Mckinney 2008 |
改变字符串的大小写:
# 全部大写
df["Language"].str.upper()
0 PYTHON GUDIO 1991
1 JAVA GOSLING 1990
2 None
3 PANDAS MCKINNEY 2008
Name: Language, dtype: object
# 全部小写
df["Language"].str.lower()
0 python gudio 1991
1 java gosling 1990
2 None
3 pandas mckinney 2008
Name: Language, dtype: object
求解字符串的长度len:
# 求解长度
df["Language"].str.len()
0 17.0
1 17.0
2 NaN
3 20.0
Name: Language, dtype: float64
3、检查字符串中是否包含指定的字符:
# 包含
df["Language"].str.contains("P")
0 True
1 False
2 None
3 True
Name: Language, dtype: object
# 筛选数据
df[df["Language"].str.contains("P") == True]
Language | |
---|---|
0 | Python Gudio 1991 |
3 | Pandas Mckinney 2008 |
检查字符串是否以指定元素开始:
df["Language"].str.startswith("J") # 是否以J开头
0 False
1 True
2 None
3 False
Name: Language, dtype: object
# 筛选数据
df[df["Language"].str.startswith("J") == True]
Language | |
---|---|
1 | Java Gosling 1990 |
检查字符串是否以指定元素结尾:
df["Language"].str.endswith("8") # 是否以8结束
0 False
1 False
2 None
3 True
Name: Language, dtype: object
df[df["Language"].str.endswith("8") == True]
Language | |
---|---|
3 | Pandas Mckinney 2008 |
df
Language | |
---|---|
0 | Python Gudio 1991 |
1 | Java Gosling 1990 |
2 | None |
3 | Pandas Mckinney 2008 |
查找指定元素第一次出现的位置(索引号,左边第一个);如果字符串中不包含该字符,则返回-1:
df["Language"].str.find("a")
0 -1.0
1 1.0
2 NaN
3 1.0
Name: Language, dtype: float64
查找指定元素在最右边出现的位置;如果字符串中不包含该字符,则返回-1:
df["Language"].str.rfind("a")
0 -1.0
1 3.0
2 NaN
3 4.0
Name: Language, dtype: float64
调整字符串的整体宽度:右对齐填充
df["Language"].str.rjust(width=20)
0 Python Gudio 1991
1 Java Gosling 1990
2 None
3 Pandas Mckinney 2008
Name: Language, dtype: object
df["Language"].str.rjust(width=30) # 前面的空白明显增加
0 Python Gudio 1991
1 Java Gosling 1990
2 None
3 Pandas Mckinney 2008
Name: Language, dtype: object
另外一个函数str.pad也可以实现;
df["Language"].str.pad(width=30)
0 Python Gudio 1991
1 Java Gosling 1990
2 None
3 Pandas Mckinney 2008
Name: Language, dtype: object
右对齐,前面使用0填充到指定字符串长度:
df["Language"].str.zfill(width=20)
0 000Python Gudio 1991
1 000Java Gosling 1990
2 None
3 Pandas Mckinney 2008
Name: Language, dtype: object
df["Language"].str.zfill(width=30)
0 0000000000000Python Gudio 1991
1 0000000000000Java Gosling 1990
2 None
3 0000000000Pandas Mckinney 2008
Name: Language, dtype: object
字符串重复(复制)指定的次数:
df["Language"].str.repeat(repeats=2)
0 Python Gudio 1991Python Gudio 1991
1 Java Gosling 1990Java Gosling 1990
2 None
3 Pandas Mckinney 2008Pandas Mckinney 2008
Name: Language, dtype: object
字符串的分割split:
# 拆分
df["Language"].str.split()
0 [Python, Gudio, 1991]
1 [Java, Gosling, 1990]
2 None
3 [Pandas, Mckinney, 2008]
Name: Language, dtype: object
拆分split和连接join的联合使用:
df["Language"].str.split().str.join("_")
0 Python_Gudio_1991
1 Java_Gosling_1990
2 None
3 Pandas_Mckinney_2008
Name: Language, dtype: object
df["Language"].str.split().str.join("+")
0 Python+Gudio+1991
1 Java+Gosling+1990
2 None
3 Pandas+Mckinney+2008
Name: Language, dtype: object
# 拆分 + 获取单个元素
df["Language"].str.split().str[0] # 第1个元素
0 Python
1 Java
2 None
3 Pandas
Name: Language, dtype: object
df["Language"].str.split().str[1] # 第二个元素
0 Gudio
1 Gosling
2 None
3 Mckinney
Name: Language, dtype: object
通过get方法来获取分割后的数据:索引从0开始
# 使用字符串的get方法
df["Language"].str.split().str.get(0)
0 Python
1 Java
2 None
3 Pandas
Name: Language, dtype: object
df["Language"].str.split().str.get(1)
0 Gudio
1 Gosling
2 None
3 Mckinney
Name: Language, dtype: object
将分割后的数据进行展开,列属性名是0,1,2......等自然数
# 使用expand参数,将返回的列表进行展开
df["Language"].str.split(" ", expand=True)
0 | 1 | 2 | |
---|---|---|---|
0 | Python | Gudio | 1991 |
1 | Java | Gosling | 1990 |
2 | None | None | None |
3 | Pandas | Mckinney | 2008 |
指定最大列属性值:n=1表示分割split之后的最大列索引值为1:
df["Language"].str.split(" ", expand=True, n=1)
0 | 1 | |
---|---|---|
0 | Python | Gudio 1991 |
1 | Java | Gosling 1990 |
2 | None | None |
3 | Pandas | Mckinney 2008 |
字符串的正则表达式
df
Language | |
---|---|
0 | Python Gudio 1991 |
1 | Java Gosling 1990 |
2 | None |
3 | Pandas Mckinney 2008 |
df["Language"].str.match("^P") # 匹配以P开头的内容
0 True
1 False
2 None
3 True
Name: Language, dtype: object
df["Language"].str.contains("J") # 匹配包含字母J
0 False
1 True
2 None
3 False
Name: Language, dtype: object
df["Language"].str.findall("[PJ]") # 匹配包含字母P或者J
0 [P]
1 [J]
2 None
3 [P]
Name: Language, dtype: object
df["Language"].str.findall('d+') # 提取字符串中的数据部分
0 [1991]
1 [1990]
2 None
3 [2008]
Name: Language, dtype: object
df["Language"].str.findall('(.*?) ')
0 [Python, Gudio]
1 [Java, Gosling]
2 None
3 [Pandas, Mckinney]
Name: Language, dtype: object
str.replace:正则表达式中的替换功能
# 将字母J和Python整个字符串替换成?
df["Language"].str.replace("^J|Python","?",case=False)
C:UsersADMINI~1AppDataLocalTemp/ipykernel_6752/2175481212.py:1: FutureWarning: The default value of regex will change from True to False in a future version.
df["Language"].str.replace("^J|Python","?",case=False)
0 ? Gudio 1991
1 ?ava Gosling 1990
2 None
3 Pandas Mckinney 2008
Name: Language, dtype: object
方法汇总
-
str.len:计算字符串长度 -
str.strip:去除字符串开头和结尾处的空格(默认) -
str.lstrip:去除字符串左边的空格(默认)或者指定字符 -
str.rtrip:去除字符串结尾处的空格(默认)或者指定字符 -
str.lower:所有字符串的字母转成小写 -
str.uppper:所有字符串的字母转成大写 -
str.find:查找字符串中指定的子字符串第一次出现的位置 -
str.rfind:查找字符串中指定的子字符串最后一次出现的位置 -
str.index:查找指定字符在字符串中第一次出现的位置(索引号) -
str.rindex:查找指定字符在字符串中最后一次出现的位置(索引号) -
str.capitalize:将字符串中的单词的第一个字母变成大写,其余字母为小写 -
str.isalpha:检查字符串是否只由字母组成 -
str.isdigit;检查字符串是否只由数字组成 -
str.islower:检查字符串是否只由小写字母组成 -
str.isupper:检查字符串是否只由大写字母组成 -
str.istitle:检查所有单词首字母是否大写,其他字母是否是小写组成 -
str.startswith:检查字符串是否以指定字符开始 -
str.endswith:检查字符串是否以指定字符结束 -
str.ljust:左对齐,默认使用空格填充 -
str.zfill:右对齐,前面使用0填充到指定字符串长度
周末送书
本次活动赠送北京大学出版社出版赞助的《Python数据分析与可视化从入门到精通》
内容简介
本书以“零基础”为起点,系统地介绍了Python在数据处理与可视化分析方面的应用。全书共分3篇12章内容,具体安排如下。
第1篇:基础篇,包括第1-4章。第1章 先来认识一下大蟒:Python入门。第2章 磨好利牙,子弹上膛:准备好工作环境。第3章 大蟒的基本技能之一:Python语言基础。第4章 大蟒的基本技能之二:Python语言进阶。
第2篇:应用篇,包括第5-11章。第5章 给大蟒找食:Python的数据存取操作。第6章 洗干净了再吃:使用Python预处理数据。第7章 什么食物有营养:大数据分析及可视化基础知识。第8章 大蟒神通之一:使用matplotlib绘制基础图形。第9章 大蟒神通之二:使用matplotlib美化和修饰图形。第10章 大蟒神通之三:数据可视化之3D图形应用。第11章 大蟒神通之四:使用图像和地图绘制图表。
第3篇:实战篇,第12章 综合案例:全国县级市天气预报数据可视化分析。以抓取中国天气网相关数据存入MySQL数据库,并绘制相应图形为主线,综合本书各章知识点介绍了数据采集、清理、保存以及绘制可视化图形的基本步骤和方法。
本书既适合希望从事Python数据处理与可视化的用户学习,也适合广大职业院校作为相关专业教材,还可作为社会培训班的参考用书。
作者简介
高博,高级工程师,IT杂家。主要研究方向为云计算与大数据、数据可视化等,熟悉.Net、PHP、Python,DevOps,MySQL、SQLServer等技术和工具。作为作者编写了《Discuz!社区管理员实用教程》《代码的力量——Discuz!源码分析与插件开发实例进阶》《PHP MySQL AJAX Web开发给力起飞》,参与编写了《Web 2.0社区网站实用宝典》《ASP.NET 4.0 MVC敏捷开发给力起飞》《Java Web应用开发给力起飞》等书籍。主持省部级纵向课题3项,参与纵向、横向课题16项,获得软件著作权12项。
刘冰,博士研究生,重庆邮电大学计算机科学与技术学院/人工智能学院教师,先后翻译出版程序设计、图像处理、计算机视觉等领域著作4部,编写教材5部,获发明专利2项,发表SCI/EI论文4篇,参与、省部级项目3项。荣获重庆邮电大学优秀班主任、优秀班导师、优秀青年教师等荣誉称号。
李力,毕业于西安交通大学计算机学院,现工作于教育考试招生战线,曾长期在国防军工单位从事网络战、信息战研究,擅长需求分析与设计,参与纵、横向课题12项,获得软件著作权4项。
送书方式
本次共包邮送书3本,通过抽奖小程序送出。公众号后台回复“20221221”获取抽奖链接
PS
以后基本每周五都会进行送书活动,小伙伴们多多来参与呀,另外如果有比较好的送书参与形式,也可以微信私聊或者后台留言哈,萝卜哥会酌情考虑的
原文始发于微信公众号(萝卜大杂烩):Pandas处理字符串方法汇总
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论