Pandas 如何提取列开头首个数字生成新列并移除原列对应数字
Pandas 提取字符串起始位置数字并移除的实现方案
问题根因
之前的实现存在两个匹配逻辑的问题:
- 提取数字时没有锚定字符串的起始位置,正则会全局扫描字符串找第一个出现的数字,导致像
"third 3"这类开头为字母的字符串,会错误匹配到末尾的数字3 - 直接全局替换数字会无差别删掉字符串中所有位置的数字,无法精准定位需要移除的开头数字,误删需要保留的其他位置数字
分步骤实现
- 首先导入依赖并构造原始测试DataFrame
import pandas as pd data = {"col1" : ["1 first 1", "2 second 2", "third 3", "4 fourth 4"]} df = pd.DataFrame(data) - 修正数字提取逻辑:在正则中加入
^锚定字符串绝对起始位置,仅提取开头位置的数字,无匹配时自动返回NaN
这一步执行后,# 提取仅位于字符串起始位置的单个数字 df["index"] = df["col1"].str.extract(r'^(\d)')third 3因为开头无数字,对应index列会正确返回NaN,不再错误提取末尾的3。 - 精准移除col1中被提取的开头数字:同样用
^锚定匹配范围,仅删除字符串最开头的数字以及数字后面紧跟的空白字符,完全保留其他位置的内容和数字# 只替换字符串开头的数字及后续空白,不影响其他位置内容 df["col1"] = df["col1"].str.replace(r'^\d\s*', '', regex=True)
最终运行结果
执行完上述代码后,输出的DataFrame完全符合预期:
col1 index 0 first 1 1 1 second 2 2 2 third 3 NaN 3 fourth 4 4
关键注意事项
- 正则中的
^是核心锚点,没有这个标识的话,匹配逻辑会变成全字符串扫描,出现位置误判 - 替换操作必须和提取操作的位置规则保持一致,不能全局替换数字,否则会把字符串末尾、中间需要保留的数字全部误删
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

