Pandas 字符串操作
Pandas 提供了强大的字符串处理功能,通过 .str 访问器可以像操作 Python 字符串一样处理 Series 中的每个元素。
str 访问器概述
当 Series 的数据类型是 object 时,可以使用 .str 访问器进行字符串操作。
实例
import pandas as pd
# 创建包含字符串的 Series
s = pd.Series(["hello", "world", "pandas", "Python"])
print("原始 Series:")
print(s)
print()
# 转换为小写
print("转小写:")
print(s.str.lower())
print()
# 转换为大写
print("转大写:")
print(s.str.upper())
print()
# 首字母大写
print("首字母大写:")
print(s.str.capitalize())
# 创建包含字符串的 Series
s = pd.Series(["hello", "world", "pandas", "Python"])
print("原始 Series:")
print(s)
print()
# 转换为小写
print("转小写:")
print(s.str.lower())
print()
# 转换为大写
print("转大写:")
print(s.str.upper())
print()
# 首字母大写
print("首字母大写:")
print(s.str.capitalize())
常用字符串函数
大小写转换
| 方法 | 说明 | 示例 |
|---|---|---|
str.lower() |
转小写 | "Hello" → "hello" |
str.upper() |
转大写 | "Hello" → "HELLO" |
str.title() |
首字母大写 | "hello world" → "Hello World" |
str.capitalize() |
首字母大写,其余小写 | "hELLO" → "Hello" |
str.swapcase() |
大小写互换 | "HeLLo" → "hEllO" |
字符串查找与替换
实例
import pandas as pd
s = pd.Series(["hello world", "python pandas", "data science", "machine learning"])
print("原始数据:")
print(s)
print()
# 包含判断
print("包含'python':")
print(s.str.contains("python", case=False))
print()
# 开头/结尾判断
print("以'hello'开头:")
print(s.str.startswith("hello"))
print()
# 替换
print("替换空格为下划线:")
print(s.str.replace(" ", "_"))
print()
# 拆分
print("按空格拆分:")
print(s.str.split(" "))
s = pd.Series(["hello world", "python pandas", "data science", "machine learning"])
print("原始数据:")
print(s)
print()
# 包含判断
print("包含'python':")
print(s.str.contains("python", case=False))
print()
# 开头/结尾判断
print("以'hello'开头:")
print(s.str.startswith("hello"))
print()
# 替换
print("替换空格为下划线:")
print(s.str.replace(" ", "_"))
print()
# 拆分
print("按空格拆分:")
print(s.str.split(" "))
去空格与填充
实例
import pandas as pd
s = pd.Series([" hello ", "world ", " pandas", " python "])
print("原始数据:")
print(s)
print()
# 去除首尾空格
print("去除首尾空格:")
print(s.str.strip())
print()
# 去除左边空格
print("去除左边空格:")
print(s.str.lstrip())
print()
# 去除右边空格
print("去除右边空格:")
print(s.str.rstrip())
print()
# 填充
print("左侧填充0至长度10:")
print(s.str.pad(10, side="left", fillchar="0"))
s = pd.Series([" hello ", "world ", " pandas", " python "])
print("原始数据:")
print(s)
print()
# 去除首尾空格
print("去除首尾空格:")
print(s.str.strip())
print()
# 去除左边空格
print("去除左边空格:")
print(s.str.lstrip())
print()
# 去除右边空格
print("去除右边空格:")
print(s.str.rstrip())
print()
# 填充
print("左侧填充0至长度10:")
print(s.str.pad(10, side="left", fillchar="0"))
切片与连接
实例
import pandas as pd
s = pd.Series(["hello", "world", "python", "pandas"])
print("原始数据:")
print(s)
print()
# 切片
print("前3个字符:")
print(s.str[:3])
print()
# 从第1位开始取3个
print("从第1位开始取3个:")
print(s.str[1:4])
print()
# 字符串连接
s1 = pd.Series(["Hello", "World"])
s2 = pd.Series(["Python", "Pandas"])
print("使用 + 连接:")
print(s1 + " " + s2)
print()
# join 连接(使用指定分隔符)
print("join 连接:")
print(s1.str.cat(s2, sep="-"))
s = pd.Series(["hello", "world", "python", "pandas"])
print("原始数据:")
print(s)
print()
# 切片
print("前3个字符:")
print(s.str[:3])
print()
# 从第1位开始取3个
print("从第1位开始取3个:")
print(s.str[1:4])
print()
# 字符串连接
s1 = pd.Series(["Hello", "World"])
s2 = pd.Series(["Python", "Pandas"])
print("使用 + 连接:")
print(s1 + " " + s2)
print()
# join 连接(使用指定分隔符)
print("join 连接:")
print(s1.str.cat(s2, sep="-"))
正则表达式支持
Pandas 的字符串函数支持正则表达式,这是处理复杂字符串模式的利器。
实例
import pandas as pd
s = pd.Series([
"user@example.com",
"test@domain.org",
"invalid-email",
"admin@site.net"
])
print("原始数据:")
print(s)
print()
# 提取邮箱
print("提取用户名:")
print(s.str.extract(r"(\w+)@"))
print()
print("提取域名:")
print(s.str.extract(r"@(\w+\.\w+)"))
print()
# 替换
print("替换邮箱为 [email]:")
print(s.str.replace(r"\w+@\w+\.\w+", "[email]", regex=True))
print()
# 包含匹配
print("包含.com或.org:")
print(s.str.contains(r"\.com|\.org"))
s = pd.Series([
"user@example.com",
"test@domain.org",
"invalid-email",
"admin@site.net"
])
print("原始数据:")
print(s)
print()
# 提取邮箱
print("提取用户名:")
print(s.str.extract(r"(\w+)@"))
print()
print("提取域名:")
print(s.str.extract(r"@(\w+\.\w+)"))
print()
# 替换
print("替换邮箱为 [email]:")
print(s.str.replace(r"\w+@\w+\.\w+", "[email]", regex=True))
print()
# 包含匹配
print("包含.com或.org:")
print(s.str.contains(r"\.com|\.org"))
提取和分割
实例
import pandas as pd
s = pd.Series(["2024-01-01", "2024-02-15", "2024-03-20"])
print("原始数据:")
print(s)
print()
# 提取年月日
extract_df = s.str.extract(r"(\d{4})-(\d{2})-(\d{2})")
extract_df.columns = ["年", "月", "日"]
print("提取年月日:")
print(extract_df)
print()
# 按分隔符拆分
s2 = pd.Series(["a,b,c", "d,e,f", "g,h,i"])
print("按逗号拆分:")
print(s2.str.split(","))
print()
# 拆分并展开为 DataFrame
print("拆分并展开:")
print(s2.str.split(",", expand=True))
s = pd.Series(["2024-01-01", "2024-02-15", "2024-03-20"])
print("原始数据:")
print(s)
print()
# 提取年月日
extract_df = s.str.extract(r"(\d{4})-(\d{2})-(\d{2})")
extract_df.columns = ["年", "月", "日"]
print("提取年月日:")
print(extract_df)
print()
# 按分隔符拆分
s2 = pd.Series(["a,b,c", "d,e,f", "g,h,i"])
print("按逗号拆分:")
print(s2.str.split(","))
print()
# 拆分并展开为 DataFrame
print("拆分并展开:")
print(s2.str.split(",", expand=True))
统计与转换
长度与计数
实例
import pandas as pd
s = pd.Series(["hello", "world", "python", "pandas"])
print("原始数据:")
print(s)
print()
# 字符串长度
print("字符串长度:")
print(s.str.len())
print()
# 字符计数
s2 = pd.Series(["hello", "world", "aaa", "bbb"])
print("字符'l'出现次数:")
print(s2.str.count("l"))
s = pd.Series(["hello", "world", "python", "pandas"])
print("原始数据:")
print(s)
print()
# 字符串长度
print("字符串长度:")
print(s.str.len())
print()
# 字符计数
s2 = pd.Series(["hello", "world", "aaa", "bbb"])
print("字符'l'出现次数:")
print(s2.str.count("l"))
类型转换
实例
import pandas as pd
# 字符串转数值
s = pd.Series(["1", "2", "3", "abc"])
print("字符串转数值:")
print(pd.to_numeric(s, errors="coerce"))
print()
# 数值转字符串
s2 = pd.Series([1, 2, 3, 4])
print("数值转字符串:")
print(s2.astype(str).str.zfill(4)) # 补零到4位
# 字符串转数值
s = pd.Series(["1", "2", "3", "abc"])
print("字符串转数值:")
print(pd.to_numeric(s, errors="coerce"))
print()
# 数值转字符串
s2 = pd.Series([1, 2, 3, 4])
print("数值转字符串:")
print(s2.astype(str).str.zfill(4)) # 补零到4位
实战:数据清洗
实例
import pandas as pd
import numpy as np
# 模拟脏数据
df = pd.DataFrame({
"姓名": [" 张三 ", "李四", "王五 "],
"电话": ["138-0000-0000", "13900000000", " 010-12345678 "],
"邮箱": ["zhangsan@email.com", "LISI@EMAIL.COM", "wang.wu@domain.com "]
})
print("原始数据:")
print(df)
print()
# 清洗步骤
# 1. 去除空格
df["姓名"] = df["姓名"].str.strip()
df["电话"] = df["电话"].str.replace("-", "").str.strip()
df["邮箱"] = df["邮箱"].str.strip().str.lower()
print("清洗后:")
print(df)
print()
# 2. 验证数据
print("邮箱验证:")
print(df["邮箱"].str.contains(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
import numpy as np
# 模拟脏数据
df = pd.DataFrame({
"姓名": [" 张三 ", "李四", "王五 "],
"电话": ["138-0000-0000", "13900000000", " 010-12345678 "],
"邮箱": ["zhangsan@email.com", "LISI@EMAIL.COM", "wang.wu@domain.com "]
})
print("原始数据:")
print(df)
print()
# 清洗步骤
# 1. 去除空格
df["姓名"] = df["姓名"].str.strip()
df["电话"] = df["电话"].str.replace("-", "").str.strip()
df["邮箱"] = df["邮箱"].str.strip().str.lower()
print("清洗后:")
print(df)
print()
# 2. 验证数据
print("邮箱验证:")
print(df["邮箱"].str.contains(r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"))
注意事项
1、处理缺失值
字符串操作默认会跳过缺失值(NaN),如果需要处理,可以使用 .fillna() 先填充。
2、大小写敏感
大部分函数默认大小写敏感,使用 case=False 参数可以进行不区分大小写的匹配。
3、正则表达式性能
正则表达式功能强大但相对较慢,处理大数据量时注意性能。
字符串处理是数据清洗的重要环节,合理使用
.str访问器可以高效完成大部分文本处理任务。
