你是否有过这样的抓狂时刻?面对一列混乱的地址数据,想提取邮编却无从下手;遇到满屏的客服记录,死活找不出所有电话号码。别慌,今天咱们就来破解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