pin_drop当前位置:知识文库 ❯ 图文
Pandas字符串操作str完整教程 - 正则提取实战
一、字符串操作概述
在数据分析中,文本数据处理是非常常见的任务。pandas为Series对象提供了.str访问器,使得我们可以像在Python字符串上一样对整个Series进行批量字符串操作,无需使用循环。
.str访问器支持几乎所有Python字符串方法,还额外提供了正则表达式匹配、提取等强大功能。它是清洗和转换文本数据的核心工具。
二、语法详解
代码示例
# 访问字符串访问器
Series.str
# 常用字符串方法
Series.str.lower() # 转小写
Series.str.upper() # 转大写
Series.str.strip() # 去除两端空白
Series.str.replace(pat, repl) # 替换
Series.str.contains(pat) # 包含匹配
Series.str.startswith(pat) # 开头匹配
Series.str.endswith(pat) # 结尾匹配
Series.str.split(pat) # 分割
Series.str.extract(pat) # 正则提取
Series.str.len() # 字符串长度三、参数说明
四、返回值
大多数.str方法返回一个新的Series对象(如lower、upper、strip等)。contains()返回布尔Series;extract(expand=True)返回DataFrame;len()返回整数Series。对于包含NaN的元素,大多数方法会返回NaN。
五、代码示例
示例1:基本用法
代码示例
import pandas as pd
# 创建示例数据
df = pd.DataFrame({
'姓名': [' 张三 ', ' 李四', '王五 ', '赵六'],
'邮箱': ['zhangsan@email.com', 'lisi@Email.COM', 'wang5@email.com', 'ZHAO6@email.com'],
'电话': ['138-0001-0001', '139-0002-0002', '137-0003-0003', '136-0004-0004'],
'地址': ['北京市朝阳区', '上海市浦东新区', '广州市天河区', '深圳市南山区']
})
# 去除空格
df['姓名'] = df['姓名'].str.strip()
# 转小写
df['邮箱'] = df['邮箱'].str.lower()
# 获取字符串长度
df['姓名长度'] = df['姓名'].str.len()
print(df)示例2:进阶用法
代码示例
# 替换操作
df['电话'] = df['电话'].str.replace('-', '')
# 检查是否包含特定字符
mask = df['地址'].str.contains('市')
print(mask)
# 开头和结尾匹配
mask2 = df['邮箱'].str.endswith('.com')
# 分割字符串
addr_split = df['地址'].str.slice(0, 3) # 提取前3个字符(省/市)
print(addr_split)
# 正则表达式提取
emails = pd.Series(['user1@gmail.com', 'user2@yahoo.com', 'user3@hotmail.com'])
extracted = emails.str.extract(r'(\w+)@(\w+)\.(\w+)')
print(extracted)
# 输出:
# 0 1 2
# 0 user1 gmail com
# 1 user2 yahoo com
# 2 user3 hotmail com示例3:实际应用
代码示例
# 模拟电商用户数据清洗
users = pd.DataFrame({
'用户名': ['user_001', 'user_002 ', ' USER_003', 'user_004', ''],
'手机号': ['+86 138 0001 1111', '138-0002-2222', '13800033333', '+86-138-0004-4444', ''],
'收货地址': ['广东省深圳市宝安区', '浙江省杭州市西湖区', '北京市朝阳区望京', '江苏省南京市鼓楼区', '']
})
# 1. 清理用户名
users['用户名'] = users['用户名'].str.strip().str.lower()
# 2. 提取纯手机号
users['手机号'] = users['手机号'].str.replace(r'[^\d]', '', regex=True)
# 3. 提取省份和城市
users[['省份', '城市']] = users['收货地址'].str.extract(r'(广东省|浙江省|江苏省|北京市|上海市)(.+?)[市区]')
# 4. 手机号脱敏
users['手机号_脱敏'] = users['手机号'].str[:3] + '****' + users['手机号'].str[-4:]
print(users)六、实际应用场景
-
数据清洗:去除多余空格、统一大小写、标准化手机号/邮箱格式
-
信息提取:从文本中提取邮箱、手机号、地址等结构化信息
-
文本分析:计算文本长度、提取关键词、分析文本特征
小贴士
.str访问器只对object类型的Series有效。如果列不是字符串类型,需要先转换:df['col'].astype(str).str.xxx()。对于大量文本数据,考虑使用向量化操作而非apply+lambda,性能差异可达10倍以上。
七、注意事项
注意1:使用正则表达式时,特殊字符需要转义,或者设置
regex=False进行纯文本匹配。
注意2:
.str方法会自动跳过NaN值,不会报错,返回的对应位置仍为NaN。
提示:复杂的字符串处理逻辑可以先用Python原生字符串方法测试,确认无误后再应用到
.str访问器。
八、小结
-
.str访问器提供了向量化的字符串操作方法 -
支持Python字符串方法、正则表达式匹配和提取等强大功能
-
合理使用正则表达式可以大幅提升文本处理效率
九、练习题
练习1
创建一个包含URL的Series,使用str方法提取每个URL的域名部分(如https://www.example.com/path → www.example.com)。
练习2
编写一个函数,使用正则表达式从包含姓名和电话号的混合文本中提取结构化信息,并处理格式不一致的情况。
练习3
对比.str.replace()和.apply(lambda x: x.replace())的性能差异,使用10万条数据测试两种方法的执行时间。
常见问题
什么时候使用.str方法,什么时候使用apply?
优先使用.str方法,它是向量化的,性能更好。只有当需要执行.str不支持的复杂操作时才使用apply。一般来说,.str能完成的场景下,性能比apply快5-10倍。
如何检查哪些行的字符串匹配特定模式?
使用df[df['col'].str.contains('pattern')]可以筛选匹配的行。如果要获取布尔索引结果直接用.str.contains()。
extract和extractall有什么区别?
extract只提取第一个匹配项,每行最多一行结果;extractall提取所有匹配项,一个匹配可能对应多行结果(通过多级索引区分)。
.str.cat方法有什么用?
.str.cat()用于连接字符串,可以指定分隔符。例如:df['姓'].str.cat(df['名'], sep='')可以将两列拼接为完整姓名。
本文涉及AI创作
内容由AI创作,请仔细甄别