pandas处理字符串方法汇总

2023-08-25 12:01:12 浏览数 (1)

Pandas中字符串处理

字符串是一种常见的数据类型,我们遇到的文本、json数据等都是属于字符串的范畴。Python内置了很多处理字符串的方法,这些方法为我们处理和清洗数据提供了很大的便利。

python内置方法

代码语言:javascript复制
# 1、自定义字符串

x = "hello python!"
x
代码语言:javascript复制
'hello python!'

查看x的类型:

代码语言:javascript复制
type(x)  # str类型
代码语言:javascript复制
str
代码语言:javascript复制
# 2、字符串拼接

y = x   " hello pandas!"  # 拼接x和hello pandas!  赋值给y
y
代码语言:javascript复制
'hello python! hello pandas!'
代码语言:javascript复制
# 3、字符串大小写转化

y_upper = y.upper()
y_upper
代码语言:javascript复制
'HELLO PYTHON! HELLO PANDAS!'
代码语言:javascript复制
y_lower = y_upper.lower()
y_lower
代码语言:javascript复制
'hello python! hello pandas!'
代码语言:javascript复制
# 4、字符串替换

y.replace('p','P')  # 小写p用大写P替换
代码语言:javascript复制
'hello Python! hello Pandas!'
代码语言:javascript复制
# 5、字符串切割

y.split(" ")  # 返回的是列表形式;里面就是切割后的每个元素
代码语言:javascript复制
['hello', 'python!', 'hello', 'pandas!']
代码语言:javascript复制
# 6、字符串去除空白

"".join(y.split())
代码语言:javascript复制
'hellopython!hellopandas!'
代码语言:javascript复制
# 7、包含与否

"m" in y
代码语言:javascript复制
False
代码语言:javascript复制
"p" in y
代码语言:javascript复制
True

还可以正则模块re来处理字符串相关的问题(不展开)。

Python内置的字符串处理方法只能处理一个字符串,如果想要同时处理,可以使用:

  • for循环,通过遍历列表来实现
  • python列表推导式来实现
代码语言:javascript复制
a = ["python","java","c"]
a
代码语言:javascript复制
['python', 'java', 'c']
代码语言:javascript复制
# 遍历循环实现

for i in a:
    print(f"The lenght of {i}: ", len(i))
代码语言:javascript复制
The lenght of python:  6
The lenght of java:  4
The lenght of c:  1
代码语言:javascript复制
# 列表推导式

[len(i) for i in a]
代码语言:javascript复制
[6, 4, 1]

但是python内置的方法存在一个问题,不能处理缺失值:

代码语言:javascript复制
b = ["python","java","c", None]  # 存在缺失值
b
代码语言:javascript复制
['python', 'java', 'c', None]
代码语言:javascript复制
# [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功能可能在未告知的情况下删除。

代码语言:javascript复制
import pandas as pd

Pandas改变Object数据类型

Object类型是我们在pandas中常用的字符串类型。

astype指定类型

代码语言:javascript复制
s = pd.Series(['a','b','c',None])
s
代码语言:javascript复制
0       a
1       b
2       c
3    None
dtype: object

上面表示的是Pandas中字符或者字符与其他类型(案例是None)的混合类型。

代码语言:javascript复制
s.dtype
代码语言:javascript复制
dtype('O')
代码语言:javascript复制
s1 = s.astype("string")  # 通过astype强制转化成string

s1
代码语言:javascript复制
0       a
1       b
2       c
3    <NA>
dtype: string

上面表示的是pandas的“纯“字符类型”。

代码语言:javascript复制
s1.dtype
代码语言:javascript复制
string[python]

在创建Series的时候可以直接指定数据类型:

代码语言:javascript复制
s2 = pd.Series(['a','b','c',None], dtype='string')
s2
代码语言:javascript复制
0       a
1       b
2       c
3    <NA>
dtype: string
代码语言:javascript复制
s2.dtype
代码语言:javascript复制
string[python]

convert_dtypes转化数据类型

代码语言:javascript复制
df = pd.DataFrame(['1','2','3',None],
                 columns=['A'])
df

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

A

0

1

1

2

2

3

3

None

代码语言:javascript复制
df.dtypes
代码语言:javascript复制
A    object
dtype: object
代码语言:javascript复制
df = df.convert_dtypes()
代码语言:javascript复制
df.dtypes
代码语言:javascript复制
A    string
dtype: object

Pandas向量化操作字符串

使用字符串的str属性

Pandas中内置了等效python的字符串操作方法:str属性

代码语言:javascript复制
df = pd.DataFrame(["Python Gudio 1991","Java Gosling 1990",None, "Pandas Mckinney 2008"],
                  columns=["Language"]
                 )

df

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Language

0

Python Gudio 1991

1

Java Gosling 1990

2

None

3

Pandas Mckinney 2008

改变字符串的大小写:

代码语言:javascript复制
# 全部大写

df["Language"].str.upper()
代码语言:javascript复制
0       PYTHON GUDIO 1991
1       JAVA GOSLING 1990
2                    None
3    PANDAS MCKINNEY 2008
Name: Language, dtype: object
代码语言:javascript复制
# 全部小写

df["Language"].str.lower()
代码语言:javascript复制
0       python gudio 1991
1       java gosling 1990
2                    None
3    pandas mckinney 2008
Name: Language, dtype: object

求解字符串的长度len:

代码语言:javascript复制
# 求解长度

df["Language"].str.len()
代码语言:javascript复制
0    17.0
1    17.0
2     NaN
3    20.0
Name: Language, dtype: float64

3、检查字符串中是否包含指定的字符:

代码语言:javascript复制
# 包含

df["Language"].str.contains("P")
代码语言:javascript复制
0     True
1    False
2     None
3     True
Name: Language, dtype: object
代码语言:javascript复制
# 筛选数据
df[df["Language"].str.contains("P") == True]

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Language

0

Python Gudio 1991

3

Pandas Mckinney 2008

检查字符串是否以指定元素开始:

代码语言:javascript复制
df["Language"].str.startswith("J")  # 是否以J开头
代码语言:javascript复制
0    False
1     True
2     None
3    False
Name: Language, dtype: object
代码语言:javascript复制
# 筛选数据

df[df["Language"].str.startswith("J") == True]

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Language

1

Java Gosling 1990

检查字符串是否以指定元素结尾:

代码语言:javascript复制
df["Language"].str.endswith("8")  # 是否以8结束
代码语言:javascript复制
0    False
1    False
2     None
3     True
Name: Language, dtype: object
代码语言:javascript复制
df[df["Language"].str.endswith("8") == True]

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Language

3

Pandas Mckinney 2008

代码语言:javascript复制
df

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Language

0

Python Gudio 1991

1

Java Gosling 1990

2

None

3

Pandas Mckinney 2008

查找指定元素第一次出现的位置(索引号,左边第一个);如果字符串中不包含该字符,则返回-1:

代码语言:javascript复制
df["Language"].str.find("a")
代码语言:javascript复制
0   -1.0
1    1.0
2    NaN
3    1.0
Name: Language, dtype: float64

查找指定元素在最右边出现的位置;如果字符串中不包含该字符,则返回-1:

代码语言:javascript复制
df["Language"].str.rfind("a")
代码语言:javascript复制
0   -1.0
1    3.0
2    NaN
3    4.0
Name: Language, dtype: float64

调整字符串的整体宽度:右对齐填充

代码语言:javascript复制
df["Language"].str.rjust(width=20)
代码语言:javascript复制
0       Python Gudio 1991
1       Java Gosling 1990
2                    None
3    Pandas Mckinney 2008
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.rjust(width=30)   # 前面的空白明显增加
代码语言:javascript复制
0                 Python Gudio 1991
1                 Java Gosling 1990
2                              None
3              Pandas Mckinney 2008
Name: Language, dtype: object

另外一个函数str.pad也可以实现;

代码语言:javascript复制
df["Language"].str.pad(width=30)
代码语言:javascript复制
0                 Python Gudio 1991
1                 Java Gosling 1990
2                              None
3              Pandas Mckinney 2008
Name: Language, dtype: object

右对齐,前面使用0填充到指定字符串长度:

代码语言:javascript复制
df["Language"].str.zfill(width=20)
代码语言:javascript复制
0    000Python Gudio 1991
1    000Java Gosling 1990
2                    None
3    Pandas Mckinney 2008
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.zfill(width=30)
代码语言:javascript复制
0    0000000000000Python Gudio 1991
1    0000000000000Java Gosling 1990
2                              None
3    0000000000Pandas Mckinney 2008
Name: Language, dtype: object

字符串重复(复制)指定的次数:

代码语言:javascript复制
df["Language"].str.repeat(repeats=2)
代码语言:javascript复制
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:

代码语言:javascript复制
# 拆分

df["Language"].str.split()
代码语言:javascript复制
0       [Python, Gudio, 1991]
1       [Java, Gosling, 1990]
2                        None
3    [Pandas, Mckinney, 2008]
Name: Language, dtype: object

拆分split和连接join的联合使用:

代码语言:javascript复制
df["Language"].str.split().str.join("_")
代码语言:javascript复制
0       Python_Gudio_1991
1       Java_Gosling_1990
2                    None
3    Pandas_Mckinney_2008
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.split().str.join(" ")
代码语言:javascript复制
0       Python Gudio 1991
1       Java Gosling 1990
2                    None
3    Pandas Mckinney 2008
Name: Language, dtype: object
代码语言:javascript复制
# 拆分   获取单个元素

df["Language"].str.split().str[0]  # 第1个元素
代码语言:javascript复制
0    Python
1      Java
2      None
3    Pandas
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.split().str[1]  # 第二个元素
代码语言:javascript复制
0       Gudio
1     Gosling
2        None
3    Mckinney
Name: Language, dtype: object

通过get方法来获取分割后的数据:索引从0开始

代码语言:javascript复制
# 使用字符串的get方法

df["Language"].str.split().str.get(0)
代码语言:javascript复制
0    Python
1      Java
2      None
3    Pandas
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.split().str.get(1)
代码语言:javascript复制
0       Gudio
1     Gosling
2        None
3    Mckinney
Name: Language, dtype: object

将分割后的数据进行展开,列属性名是0,1,2…等自然数

代码语言:javascript复制
# 使用expand参数,将返回的列表进行展开

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

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

0

1

2

0

Python

Gudio

1991

1

Java

Gosling

1990

2

None

None

None

3

Pandas

Mckinney

2008

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

代码语言:javascript复制
df["Language"].str.split(" ", expand=True, n=1)

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

0

1

0

Python

Gudio 1991

1

Java

Gosling 1990

2

None

None

3

Pandas

Mckinney 2008

代码语言:javascript复制

字符串的正则表达式

代码语言:javascript复制
df

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Language

0

Python Gudio 1991

1

Java Gosling 1990

2

None

3

Pandas Mckinney 2008

代码语言:javascript复制
df["Language"].str.match("^P")  # 匹配以P开头的内容
代码语言:javascript复制
0     True
1    False
2     None
3     True
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.contains("J")  # 匹配包含字母J
代码语言:javascript复制
0    False
1     True
2     None
3    False
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.findall("[PJ]")  # 匹配包含字母P或者J
代码语言:javascript复制
0     [P]
1     [J]
2    None
3     [P]
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.findall('d ')  # 提取字符串中的数据部分
代码语言:javascript复制
0    [1991]
1    [1990]
2      None
3    [2008]
Name: Language, dtype: object
代码语言:javascript复制
df["Language"].str.findall('(.*?) ')
代码语言:javascript复制
0       [Python, Gudio]
1       [Java, Gosling]
2                  None
3    [Pandas, Mckinney]
Name: Language, dtype: object

str.replace:正则表达式中的替换功能

代码语言:javascript复制
# 将字母J和Python整个字符串替换成?

df["Language"].str.replace("^J|Python","?",case=False)
代码语言:javascript复制
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

方法汇总

  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填充到指定字符串长度

0 人点赞