如何在Pandas里像侦探一样挖出字符串的秘密?

你是否有过这样的抓狂时刻?面对一列混乱的地址数据,想提取邮编却无从下手;遇到满屏的客服记录,死活找不出所有电话号码。别慌,今天咱们就来破解Pandas里两个超好用的”文字侦探工具”——extract()extractall(),保准你学完就能变身数据界的福尔摩斯!

先搞清楚游戏规则

想玩转这两个方法,得先备好两样东西:正则表达式命名捕获组。举个栗子,假设我们有串文字”订单号:P-2023-0815″,想提取中间的日期部分,可以这样写正则:(\d{4}-\d{4}),但更聪明的做法是用(?P<date>\d{4}-\d{4})给捕获组起个名字。

重点来了:

– 用圆括号()框住要捕获的内容

– ?P<名字>给捕获组起名(就像给Excel列命名)

– 正则表达式最好先在regex101这类网站测试

单兵作战的extract()

这个方法最适合处理”每个单元格只取一个特征”的情况。比如从员工信息里统一提取工号,假设数据长这样:

| 员工信息 | |————————| | 张三_EMP001_销售部 | | 李四_EMP002_技术部 |

python df[‘员工信息’].str.extract(r'(?P<工号>EMP\d+)’)

输出结果就是干干净净的工号列:

| 工号 | |——-| | EMP001| | EMP002|

三个常见坑点要注意:

1. 正则写错时直接返回NaN(记得先测试)

2. 没有命名捕获组时列名变成数字

3. 如果有多处匹配,默认只取第一处

群体围剿的extractall()

当遇到”一个单元格藏多个线索”的情况,就该召唤这个神器了。比如分析客服对话记录:

| 对话记录 | |———————————-| | 来电时间09:30,电话13812345678 | | 下午15:20接到15900001111来电 |

python df[‘对话记录’].str.extractall(r'(?P<时间>\d{1,2}:\d{2})|(?P<电话>\d{11})’)

这时候会得到分层索引的结果:

| | 时间 | 电话 | |——–|——-|————-| | 0 0 | 09:30 | NaN | | 0 1 | NaN | 13812345678 | | 1 0 | 15:20 | NaN | | 1 1 | NaN | 15900001111 |

发现玄机了吗?每个原始单元格可能对应多行结果,第一层索引是原数据行号,第二层是匹配序号。处理这种数据时,通常要搭配reset_index()重整索引。

灵魂拷问环节

Q:什么时候该用extract(),什么时候用extractall()? A:想象你在拆礼物——如果每个盒子里只有一件物品,用extract();要是盒子里塞满了各种小物件,必须用extractall()把宝贝都翻出来。

Q:提取出来的数据总是乱码怎么办? A:八成是正则表达式背锅!记得先用str.contains()测试匹配情况,比如: python df[df[‘地址’].str.contains(r’\d{6}’)] # 先确认有没有6位数字

Q:能同时提取多个字段吗? A:当然!比如从”姓名:张三;年龄:28″中同时抓名字和年龄: python pattern = r’姓名:(?P<name>\w+);年龄:(?P<age>\d+)’ df[‘信息’].str.extract(pattern)

小编的实战心得

刚开始用这两个函数时,我也被正则表达式折磨得够呛。后来发现个诀窍:先用str.findall()看匹配结果,确认没问题再上extract。比如处理产品规格时: “`python

先摸底

df[‘规格’].str.findall(r’\d+[kgml]’)

再精准提取

df[‘规格’].str.extract(r'(?P<重量>\d+kg)|(?P<容量>\d+ml)’) “`

最近在处理客户地址数据时,发现个有趣现象——用extractall()提取门牌号时,意外发现有些客户在地址栏藏了多个联系方式。这提醒我们,数据清洗不仅是技术活,更是发现业务洞见的过程。

最后说句大实话:这两个方法虽然强大,但别指望它们能解决所有文本问题。遇到特别复杂的文本解析,还是考虑用专门的NLP库更靠谱。但对于日常80%的字符串提取需求,这对黄金搭档绝对能让你事半功倍!

免责声明:网所有文字、图片、视频、音频等资料均来自互联网,不代表本站赞同其观点,内容仅提供用户参考,若因此产生任何纠纷,本站概不负责,如有侵权联系本站删除!邮箱:207985384@qq.com https://www.ainiseo.com/hosting/36959.html

(0)
上一篇 2025年5月7日 下午9:33
下一篇 2025年5月7日 下午9:40

相关文章推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

aisoboke
QQ 微信 Telegram
分享本页
返回顶部