社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】Pandas处理字符串方法汇总

机器学习初学者 • 2 年前 • 269 次点击  

公众号:尤而小屋
作者: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内置的字符串处理方法只能处理一个字符串,如果想要同时处理,可以使用:

  • 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
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

A
01
12
23
3None
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
0Python Gudio 1991
1Java Gosling 1990
2None
3Pandas 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
0Python Gudio 1991
3Pandas 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
1Java 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
3Pandas Mckinney 2008
df

Language
0Python Gudio 1991
1Java Gosling 1990
2None
3Pandas 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)

012
0PythonGudio1991
1JavaGosling1990
2NoneNoneNone
3PandasMckinney2008

指定最大列属性值:n=1表示分割split之后的最大列索引值为1:

df["Language"].str.split(" ", expand=True, n=1)

01
0PythonGudio 1991
1JavaGosling 1990
2NoneNone
3PandasMckinney 2008

字符串的正则表达式

df

Language
0Python Gudio 1991
1Java Gosling 1990
2None
3Pandas 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

方法汇总

  1. str.len:计算字符串长度
  2. str.strip:去除字符串开头和结尾处的空格(默认)
  3. str.lstrip:去除字符串左边的空格(默认)或者指定字符
  4. str.rtrip:去除字符串结尾处的空格(默认)或者指定字符
  5. str.lower:所有字符串的字母转成小写
  6. str.uppper:所有字符串的字母转成大写
  7. str.find:查找字符串中指定的子字符串第一次出现的位置
  8. str.rfind:查找字符串中指定的子字符串最后一次出现的位置
  9. str.index:查找指定字符在字符串中第一次出现的位置(索引号)
  10. str.rindex:查找指定字符在字符串中最后一次出现的位置(索引号)
  11. str.capitalize:将字符串中的单词的第一个字母变成大写,其余字母为小写
  12. str.isalpha:检查字符串是否只由字母组成
  13. str.isdigit;检查字符串是否只由数字组成
  14. str.islower:检查字符串是否只由小写字母组成
  15. str.isupper:检查字符串是否只由大写字母组成
  16. str.istitle:检查所有单词首字母是否大写,其他字母是否是小写组成
  17. str.startswith:检查字符串是否以指定字符开始
  18. str.endswith:检查字符串是否以指定字符结束
  19. str.ljust:左对齐,默认使用空格填充
  20. str.zfill:右对齐,前面使用0填充到指定字符串长度



    
往期精彩回顾




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/150778
 
269 次点击