
本文介绍如何使用pandas高效地从字符串列中提取首个连续数字子串,自动去除前导零并转为整数类型,存入新列,避免返回嵌套列表的问题。
本文介绍如何使用pandas高效地从字符串列中提取首个连续数字子串,自动去除前导零并转为整数类型,存入新列,避免返回嵌套列表的问题。
在实际数据处理中,常遇到类似'route 012d'或'SR-007X'这类混杂文本的字段,需从中精准提取数字部分(如12、7)并以整数形式存储。直接使用re.findall配合列表推导式(如[re.findall(r'\d+', x) for x in sp['RouteIdentifier']])会生成嵌套列表(如[012]),不仅类型错误(list而非int),也无法直接参与数值计算。
推荐采用 pandas 原生向量化方法,简洁、高效且语义清晰:
import pandas as pd
# 示例数据
data = {'RouteIdentifier': ['route 012d', 'route 010noise', 'SR-007X', 'exit42b'],
'Col': ['hello', 'world', 'test', 'demo']}
sp = pd.DataFrame(data)
# 提取首个数字子串 → 转为整数 → 插入新列(位置索引1)
sp.insert(1, 'StateRoute',
sp['RouteIdentifier'].str.extract(r'(\d+)')[0].astype(int))
执行后结果如下:
RouteIdentifier StateRoute Col 0 route 012d 12 hello 1 route 010noise 10 world 2 SR-007X 7 test 3 exit42b 42 demo
✅ 关键点解析:
- str.extract(r'(\d+)') 使用捕获组 (\d+) 确保返回单列 Series(而非多列 DataFrame),且仅匹配第一个连续数字序列;
- [0] 选取提取结果的第0列(因extract返回DataFrame);
- .astype(int) 自动将 '012'、'007' 等字符串转为整数 12、7,天然消除前导零;
- 若无需指定插入位置,可简化为赋值操作:sp['StateRoute'] = sp['RouteIdentifier'].str.extract(r'(\d+)')[0].astype(int)。
⚠️ 注意事项:
- 若某行无数字,str.extract 返回 NaN,astype(int) 会报错(TypeError: Cannot convert NA to integer)。安全做法是先用 fillna(0) 或 dropna=False 配合 pd.to_numeric(..., errors='coerce') 处理缺失值;
- 如需提取所有数字(非仅首个),应改用 str.findall(r'\d+') 并结合 str[0] 取首项,但性能略低;
- 正则 r'(\d+)' 默认贪婪匹配,已足够应对多数场景;若需更精确控制(如限定2–4位数字),可调整为 r'(\d{2,4})'。
该方法兼具可读性、健壮性与执行效率,是清洗含编号文本字段的标准实践。











