如何将字母数字字符串列拆分为首部数字列与剩余内容列?
拆分字母数字字符串为开头数字组与剩余内容
需求:将DataFrame的Col A列拆分为两列A1和A2:
A1提取字符串开头的所有连续数字部分(包含带空格的数字组,如“2 200”)A2保留剩余内容,若无剩余则为null
示例输入
| Col A |
|---|
| 2 Nutsx20mm |
| 2 200 jibs50 |
| 3 200 |
| 5 |
| 8 Certs 20 |
期望输出
| A1 | A2 |
|---|---|
| 2 | Nutsx20mm |
| 2 200 | jibs50 |
| 3 200 | null |
| 5 | null |
| 8 | Certs 20 |
尝试过的错误代码
df_tab["Col A"].str.extract(r'(\d+)(?: (\S.+))?$')
当前错误输出
| A1 | A2 |
|---|---|
| 2 | Nutsx20mm |
| 2 | 200 jibs50 |
| 3 | 200 |
| 5 | |
| 8 | Certs 20 |
正确实现方法
使用修正后的正则表达式,匹配开头所有由空格分隔的数字组,然后捕获剩余内容:
import pandas as pd df_tab[["A1", "A2"]] = df_tab["Col A"].str.extract(r'^((?:\d+\s*)+)(.*)$')
正则表达式解释
^:锚定字符串开头,确保只匹配开头的数字组((?:\d+\s*)+):捕获A1的内容(?:\d+\s*):非捕获组,匹配一段数字(\d+)加上可选的空格(\s*)+:重复该非捕获组,匹配所有连续的“数字+空格”组合(比如“2 200”)
(.*):捕获A2的剩余内容,无剩余时为空字符串
处理空值转为null
若需要把A2的空字符串转为pandas的NA(对应需求中的null),添加以下代码:
df_tab["A2"] = df_tab["A2"].str.strip().replace('', pd.NA)
最终结果
运行后得到与期望一致的输出:
| A1 | A2 |
|---|---|
| 2 | Nutsx20mm |
| 2 200 | jibs50 |
| 3 200 | |
| 5 | |
| 8 | Certs 20 |
内容的提问来源于stack exchange,提问作者Pravin
相关产品推荐
相关产品推荐

