如何在pandas中提取姓名与带括号数字生成新列并删除原列,能否单行实现?
Pandas提取姓名与带方括号数字并生成新列的高效实现
核心思路:向量化字符串提取(比lambda高效)
优先用pandas内置的str.extract方法,它是向量化操作,不需要逐行遍历,性能远高于lambda+apply组合。我们用正则表达式一次性匹配出姓名和三个数字,同时自动去掉方括号。
分步实现(适合新手理解)
- 先准备模拟数据(贴合你的原始列格式):
import pandas as pd df = pd.DataFrame({'原列': ['张三[10][20][30]', '李四[15][25][35]', '王五[5][15][25]', '赵六 [8][18][28]']})
- 提取并生成新列:
# 用正则提取姓名和三个数字,自动剥离方括号 extract_result = df['原列'].str.extract(r'([^\[]+)\[(\d+)\]\[(\d+)\]\[(\d+)\]') # 给新列命名 extract_result.columns = ['姓名', '数字1', '数字2', '数字3'] # 清理姓名可能带的多余空格 extract_result['姓名'] = extract_result['姓名'].str.strip() # 合并结果并删除原列 df = pd.concat([df.drop('原列', axis=1), extract_result], axis=1)
单行代码实现(高效简洁)
用pop方法直接取出原列并删除,结合join和rename一步完成所有操作:
df = df.join(df.pop('原列').str.extract(r'([^\[]+)\[(\d+)\]\[(\d+)\]\[(\d+)\]').assign(姓名=lambda x: x[0].str.strip()).rename(columns={0:'姓名', 1:'数字1', 2:'数字2', 3:'数字3'}))
正则表达式说明(新手必看)
([^\[]+):匹配所有不是左方括号的字符,精准提取姓名部分\[(\d+)\]:匹配[数字]格式的内容,(\d+)只提取里面的数字,重复三次对应三个数字列- 如果你的数字包含小数,可把
\d+改成[\d.]+适配
最终效果示例
执行后DataFrame结构:
| 姓名 | 数字1 | 数字2 | 数字3 |
|---|---|---|---|
| 张三 | 10 | 20 | 30 |
| 李四 | 15 | 25 | 35 |
| 王五 | 5 | 15 | 25 |
| 赵六 | 8 | 18 | 28 |
内容的提问来源于stack exchange,提问作者user20280250
相关产品推荐
相关产品推荐

