pin_drop当前位置:知识文库 ❯ 图文

Pandas字符串操作str完整教程 - 正则提取实战

Pandas Series字符串操作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()            # 字符串长度

三、参数说明

方法 关键参数 说明
replace() pat, repl, regex=True/False pat为匹配模式,repl为替换值,regex控制是否使用正则
contains() pat, case=True, na=NaN, regex=True 返回布尔Series,case控制大小写敏感,na处理缺失值
extract() pat, flags=0, expand=True 用正则捕获组提取,返回DataFrame(expand=True时)
split() pat=None, n=-1, expand=False pat为分隔符,n限制分割次数,expand=True返回DataFrame
extractall() pat, flags=0 提取所有匹配项,返回带多级索引的DataFrame

四、返回值

大多数.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='')可以将两列拼接为完整姓名。

标签: pandas 字符串操作 str访问器 正则表达式 数据清洗 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Pandas数据类型转换详解 - astype to_numeric教程 下一篇: Pandas读写文件大全 - CSV Excel JSON读写教程

poll相关推荐