Pandas 字符串处理技巧:格式化、正则匹配与拼接操作
本文深入讲解了 Pandas 中常用的字符串处理方法,包括格式化字符、正则匹配和字符串拼接。文章介绍了如何使用 str.upper()
、str.lower()
等方法转换大小写,去除空白字符,以及使用 str.split()
分割字符串。接着,重点介绍了正则表达式在 Pandas 中的应用,如使用 str.contains()
和 str.match()
进行模式匹配,利用 str.replace()
进行字符串替换,以及通过 str.extract()
和 str.extractall()
提取符合正则规则的子字符串。最后,展示了 str.cat()
方法在字符串拼接中的应用。通过具体代码示例,帮助读者掌握高效的数据清洗与文本处理技巧。
文章目录
- Pandas 字符串处理技巧:格式化、正则匹配与拼接操作
- 一 主要涉及方法
- 二 格式化字符
- 1 Python原生转换大小写
- 2 Pandas库中转换大小写
- 3 Python原生去除空白
- 4 Pandas库去除空白
- 5 Python原生字符串分割
- 6 Pandas库字符串分割
- 注意事项
- 三 正则匹配
- 1 str.contains()
- 2 str.match()
- 3 str.replace()
- 4 str.extract()
- 5 str.extractall()
- 四 拼接
- 五 完整代码示例
- 六 源码地址
预备课: Python 正则表达式详解:从基础匹配到高级应用
导入第三方库
import pandas as pd
一 主要涉及方法
格式化字符 | 正则匹配 | 拼接 |
---|---|---|
str.upper(); str.lower(); str.len() | str.contains(); str.match() | str.cat() |
str.strip(); str.lstrip(); str.rstrip() | str.replace() | |
str.split() | str.extract(); str.extractall() |
二 格式化字符
1 Python原生转换大小写
py_s = "A,B,C,Aaba,Baca,CABA,dog,cat"print("python:\n", py_s.upper())print("python lower:\n", py_s.lower())# 获取每个子串的长度print("python len:\n", [len(s) for s in py_s.split(",")])
2 Pandas库中转换大小写
pd_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],dtype="string")print("\npandas:\n", pd_s.str.upper())print("\npandas lower:\n", pd_s.str.lower())# 获取每个字符串的长度print("\npandas len:\n", pd_s.str.len())
3 Python原生去除空白
py_s = [" jack", "jill ", " jesse ", "frank"]print("python strip:\n", [s.strip() for s in py_s])print("\n\npython lstrip:\n", [s.lstrip() for s in py_s])print("\n\npython rstrip:\n", [s.rstrip() for s in py_s])
4 Pandas库去除空白
pd_s = pd.Series(py_s, dtype="string")print("\npandas strip:\n", pd_s.str.strip())print("\npandas lstrip:\n", pd_s.str.lstrip())print("\npandas rstrip:\n", pd_s.str.rstrip())
5 Python原生字符串分割
py_s = ["a_b_c", "jill_jesse", "frank"]print("python split:\n", [s.split("_") for s in py_s])
6 Pandas库字符串分割
pd_s = pd.Series(py_s, dtype="string")print("\npandas split:\n", pd_s.str.split("_"))
字符串扩展成一个DataFrame
print(pd_s.str.split("_", expand=True))pd_df = pd.DataFrame([["a", "b"], ["C", "D"]], dtype="string")print(pd_df.iloc[0, :].str.upper())
注意事项
Pandas中的文字处理需要确保Series
或DataFrame
的dtype="string"
。如果不确定数据类型,可以使用str.astype("string")
进行转换。
pd_not_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],)print("pd_not_s type:", pd_not_s.dtype)pd_s = pd_not_s.astype("string")print("pd_s type:", pd_s.dtype)
三 正则匹配
1 str.contains()
str.contains()
方法是查找包含一个数字后跟一个小写字母的字符串。
pattern = r"[0-9][a-z]"s = pd.Series(["1", "-i1a1-iii", "11c", "abc"], dtype="string")print(s.str.contains(pattern))
pattern = r"[0-9][a-z]"
:这个正则表达式匹配一个数字(0到9中的任意一个)后紧跟一个小写字母(从a到z)。[0-9]
表示数字的范围,[a-z]
表示小写字母的范围。
2 str.match()
str.match()
方法是检查字符串开头是否符合指定的正则表达式模式。
s = pd.Series(["1", "1a", "11c", "abc"], dtype="string")pattern = r"[0-9]+?[a-z]"print(s.str.match(pattern))pattern = r"[0-9][a-z]"print(s.str.match(pattern))
第一个正则表达式:r"[0-9]+?[a-z]"
,匹配一个或多个数字,紧接着一个小写字母。
第二个正则表达式:r"[0-9][a-z]"
,匹配一个单独的数字后紧跟一个小写字母。
3 str.replace()
字符串替换方法。
py_s = ["1", "1a", "21c", "abc"]pd_s = pd.Series(py_s, dtype="string")print("py_s replace '1' -> '9':\n", [s.replace("1", "9") for s in py_s])print("\n\npd_s replace '1' -> '9':\n", pd_s.str.replace("1", "9"))print("pd_s replace -> 'NUM':")print(pd_s.str.replace(r"[0-9]", "NUM", regex=True))
pandas支持正则表达式字符串替换。
4 str.extract()
str.extract()
用于从字符串中抽取符合正则表达式模式的子串,并以DataFrame的形式返回结果。字符串中的模式与正则表达式不匹配,则对应的列会填充 NaN
。
s = pd.Series(['a1', 'b2', 'c3'])print(s)print(s.str.extract(r"([ab])(\d)"))
正则表达式 r"([ab])(\d)"
的含义是:
([ab])
:这个组匹配单个字符,要么是'a'
要么是'b'
。这是一个捕获组,将匹配的结果保存下来。(\d)
:这个组匹配单个数字(0-9)。这也是一个捕获组,将匹配的结果保存下来。
5 str.extractall()
str.extractall()
是 Pandas 提供的一种高效的字符串处理工具,能够从 Series
或 DataFrame
的单列中提取出所有符合正则表达式的匹配项。不同于 str.extract()
只返回首个匹配项,str.extractall()
能识别并提取出每一处匹配,使其特别适合处理包含重复模式的数据。
s = pd.Series(['a1', 'b2', 'c3', 'a1a2'])
print(s.str.extractall(r"([ab])(\d)"))
运行结果
0 1match
0 0 a 1
1 0 b 2
3 0 a 11 a 2
这里,索引 0 和 1 对应原始 Series
中的前两个元素 'a1'
和 'b2'
,每个元素内部只有一个匹配,因此 match
都是 0。对于元素 'a1a2'
(索引 3),存在两个匹配,分别是 'a1'
和 'a2'
,因此 match
索引分别是 0 和 1,表示它们是同一个字符串中的第一和第二个匹配。
四 拼接
str.cat()
方法是用于将一个字符串 Series
与另一个字符串或整个字符串 Series
连接起来。
s1 = pd.Series(["A", "B", "C", "D"], dtype="string")
print(s1)
s2 = pd.Series(["1", "2", "3", "4"], dtype="string")
print(s2)
print(s1.str.cat(s2))
print(s1.str.cat(s2, sep="-"))
sep="-"
指定了连接时使用的分隔符 "-"
,意味着每对连接的字符串之间都会加上一个 "-"
。
五 完整代码示例
# This is a sample Python script.# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.
import pandas as pddef print_hi(name):# Use a breakpoint in the code line below to debug your script.print(f'Hi, {name}') # Press ⌘F8 to toggle the breakpoint.# 格式化字符# str.upper(); str.lower(); str.len()# str.strip(); str.lstrip(); str.rstrip()# str.split()# 正则方案# str.contains(); str.match();# str.replace()# str.extract(); str.extractall()# 拼接# str.cat()# 格式化字符py_s = "A,B,C,Aaba,Baca,CABA,dog,cat"print("python:\n", py_s.upper())print("python lower:\n", py_s.lower())print("python len:\n", [len(s) for s in py_s.split(",")])pd_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],dtype="string")print("\npandas:\n", pd_s.str.upper())print("\npandas lower:\n", pd_s.str.lower())print("\npandas len:\n", pd_s.str.len())print()pd_not_s = pd.Series(["A", "B", "C", "Aaba", "Baca", "CABA", "dog", "cat"],)print("pd_not_s type:", pd_not_s.dtype)pd_s = pd_not_s.astype("string")print("pd_s type:", pd_s.dtype)print()py_s = [" jack", "jill ", " jesse ", "frank"]print("python strip:\n", [s.strip() for s in py_s])print("\n\npython lstrip:\n", [s.lstrip() for s in py_s])print("\n\npython rstrip:\n", [s.rstrip() for s in py_s])pd_s = pd.Series(py_s, dtype="string")print("\npandas strip:\n", pd_s.str.strip())print("\npandas lstrip:\n", pd_s.str.lstrip())print("\npandas rstrip:\n", pd_s.str.rstrip())py_s = ["a_b_c", "jill_jesse", "frank"]print("python split:\n", [s.split("_") for s in py_s])pd_s = pd.Series(py_s, dtype="string")print("\npandas split:\n", pd_s.str.split("_"))print(pd_s.str.split("_", expand=True))pd_df = pd.DataFrame([["a", "b"], ["C", "D"]], dtype="string")print(pd_df.iloc[0, :].str.upper())# 正则方案pattern = r"[0-9][a-z]"s = pd.Series(["1", "-i1a1-iii", "1c", "abc"], dtype="string")print(s.str.contains(pattern))s = pd.Series(["1", "1a", "11c", "abc"], dtype="string")pattern = r"[0-9]+?[a-z]"print(s.str.match(pattern))pattern = r"[0-9][a-z]"print(s.str.match(pattern))py_s = ["1", "1a", "21c", "abc"]pd_s = pd.Series(py_s, dtype="string")print("py_s replace '1' -> '9':\n", [s.replace("1", "9") for s in py_s])print("\n\npd_s replace '1' -> '9':\n", pd_s.str.replace("1", "9"))print("pd_s replace -> 'NUM':")print(pd_s.str.replace(r"[0-9]", "NUM", regex=True))s = pd.Series(['a1', 'b2', 'c3'])print(s)print(s.str.extract(r"([ab])(\d)"))s = pd.Series(['a1', 'b2', 'c3', 'a1a2'])print(s.str.extractall(r"([ab])(\d)"))# 拼接s1 = pd.Series(["A", "B", "C", "D"], dtype="string")print(s1)s2 = pd.Series(["1", "2", "3", "4"], dtype="string")print(s2)print(s1.str.cat(s2))print(s1.str.cat(s2, sep="-"))# Press the green button in the gutter to run the script.
if __name__ == '__main__':print_hi('文字处理')# See PyCharm help at https://www.jetbrains.com/help/pycharm/
复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。
Hi, 文字处理
python:A,B,C,AABA,BACA,CABA,DOG,CAT
python lower:a,b,c,aaba,baca,caba,dog,cat
python len:[1, 1, 1, 4, 4, 4, 3, 3]pandas:0 A
1 B
2 C
3 AABA
4 BACA
5 CABA
6 DOG
7 CAT
dtype: stringpandas lower:0 a
1 b
2 c
3 aaba
4 baca
5 caba
6 dog
7 cat
dtype: stringpandas len:0 1
1 1
2 1
3 4
4 4
5 4
6 3
7 3
dtype: Int64pd_not_s type: object
pd_s type: stringpython strip:['jack', 'jill', 'jesse', 'frank']python lstrip:['jack', 'jill ', 'jesse ', 'frank']python rstrip:[' jack', 'jill', ' jesse', 'frank']pandas strip:0 jack
1 jill
2 jesse
3 frank
dtype: stringpandas lstrip:0 jack
1 jill
2 jesse
3 frank
dtype: stringpandas rstrip:0 jack
1 jill
2 jesse
3 frank
dtype: string
python split:[['a', 'b', 'c'], ['jill', 'jesse'], ['frank']]pandas split:0 [a, b, c]
1 [jill, jesse]
2 [frank]
dtype: object0 1 2
0 a b c
1 jill jesse <NA>
2 frank <NA> <NA>
0 A
1 B
Name: 0, dtype: string
0 False
1 True
2 True
3 False
dtype: boolean
0 False
1 True
2 True
3 False
dtype: boolean
0 False
1 True
2 False
3 False
dtype: boolean
py_s replace '1' -> '9':['9', '9a', '29c', 'abc']pd_s replace '1' -> '9':0 9
1 9a
2 29c
3 abc
dtype: string
pd_s replace -> 'NUM':
0 NUM
1 NUMa
2 NUMNUMc
3 abc
dtype: string
0 a1
1 b2
2 c3
dtype: object0 1
0 a 1
1 b 2
2 NaN NaN0 1match
0 0 a 1
1 0 b 2
3 0 a 11 a 2
0 A
1 B
2 C
3 D
dtype: string
0 1
1 2
2 3
3 4
dtype: string
0 A1
1 B2
2 C3
3 D4
dtype: string
0 A-1
1 B-2
2 C-3
3 D-4
dtype: string
六 源码地址
代码地址:
国内看 Gitee 之 pandas/文字处理.py
国外看 GitHub 之 pandas/文字处理.py
引用 莫烦 Python