如何用Python正则表达式对Pandas列做条件判断并提取账号至新列
问题解决:拆分Pandas列中括号内的账号
现有数据集
| Account | |
|---|---|
| 1 | Kevin (1234567) |
| 2 | Buzz (7896345) |
| 3 | Snakes (5438761) |
| 4 | Marv |
| 5 | Harry (9083213) |
需求
检查Account列末尾是否存在括号包裹的数字账号,若存在则拆分出账号存入新列Account_Number,不存在的行该列留空(或可选删除该行)。
原代码问题分析
- 正则表达式错误:
r'\(d+'未正确匹配数字,应改为r'\(\d+\)'(\d表示匹配数字,需匹配闭合的括号) - 语法与逻辑错误:
loc赋值语句格式错误,split使用空字符串作为分隔符完全不符合需求,且未正确定义new变量
正确实现方法
方法1:使用str.extract(推荐,简洁高效)
str.extract专门用于从字符串中提取正则匹配的内容,直接捕获括号内的数字:
import pandas as pd # 构建数据集 data = { 'Account': ['Kevin (1234567)', 'Buzz (7896345)', 'Snakes (5438761)', 'Marv', 'Harry (9083213)'] } dataset = pd.DataFrame(data, index=[1,2,3,4,5]) # 提取括号内的账号数字,无匹配则留空(NaN) dataset['Account_Number'] = dataset['Account'].str.extract(r'\((\d+)\)')
方法2:修正原代码的条件筛选+拆分逻辑
先筛选出包含账号的行,再拆分提取内容:
import pandas as pd data = { 'Account': ['Kevin (1234567)', 'Buzz (7896345)', 'Snakes (5438761)', 'Marv', 'Harry (9083213)'] } dataset = pd.DataFrame(data, index=[1,2,3,4,5]) # 创建布尔掩码,标记存在账号的行 has_account = dataset['Account'].str.contains(r'\(\d+\)') # 对匹配行拆分并提取账号 dataset.loc[has_account, 'Account_Number'] = dataset.loc[has_account, 'Account'].str.split(r'\(|\)', expand=True)[1]
处理结果
执行后数据集如下:
| Account | Account_Number | |
|---|---|---|
| 1 | Kevin (1234567) | 1234567 |
| 2 | Buzz (7896345) | 7896345 |
| 3 | Snakes (5438761) | 5438761 |
| 4 | Marv | NaN |
| 5 | Harry (9083213) | 9083213 |
若需要跳过(删除)无账号的行,可执行:
dataset = dataset.dropna(subset=['Account_Number'])
内容的提问来源于stack exchange,提问作者Tanner Ormanoski
相关产品推荐
相关产品推荐

