公众号:尤而小屋 作者:Peter 编辑:Peter
本文给大家介绍的是如何使用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 y
False
"p" in y
True
还可以正则模块re来处理字符串相关的问题(不展开)。
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 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 dtype: string
s2.dtype
string[python]
convert_dtypes转化数据类型 df = pd.DataFrame(['1' ,'2' ,'3' ,None ], columns=['A' ]) df
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:\Users\ADMINI~1\AppData\Local\Temp/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.strip:去除字符串开头和结尾处的空格(默认) str.lstrip:去除字符串左边的空格(默认)或者指定字符 str.rtrip:去除字符串结尾处的空格(默认)或者指定字符 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.zfill:右对齐,前面使用0填充到指定字符串长度
机器学习交流qq群955171419,加入微信群请 扫码