Python如何从混合数据类型列中提取10位及以上长度的数字
混合类型列提取定长连续数字实现方案
问题根因
之前使用regex、lambda、apply/map时出现整列被识别为单个字符串的核心原因是Column2列混合了数值、字符串等多种数据类型,pandas做类型推断时未逐行按字符串处理,直接传参会触发类型适配异常。不需要使用split方法逐段切分,基于正则逐行扫描即可覆盖文本、数字混杂的场景。
实现逻辑
- 第一步:将Column2列所有值统一强制转换为字符串类型,从根源解决混合类型导致的识别异常
- 第二步:用正则规则
\d{10,}逐行扫描文本,提取所有连续10位及以上的纯数字段,自动跳过普通文本、短数字、不符合长度要求的内容 - 第三步:将匹配结果写入Column3列,无匹配内容的行返回空值
可直接运行的代码
import pandas as pd import re # 生成临时字符串列,统一类型避免识别异常 df['col2_tmp'] = df['Column2'].astype(str) # 定义逐行提取规则 def extract_long_num(content): match_result = re.findall(r'\d{10,}', content) # 多匹配结果用逗号拼接,无匹配返回空字符串 return ','.join(match_result) if match_result else '' # 生成结果列 df['Column3'] = df['col2_tmp'].apply(extract_long_num) # 清理临时列 df.drop(columns=['col2_tmp'], inplace=True)
自定义调整说明
- 如果需要排除带小数点的数值里的数字段(比如不希望从
3.14159265358979这类小数中提取长数字),可以将正则替换为r'(?<!\.)\d{10,}(?!\.)',仅匹配前后无小数点的连续长数字 - 如果一行存在多个符合要求的长数字、且仅需要保留第一个匹配结果,将返回逻辑修改为
return match_result[0] if match_result else ''即可 - 如果需要空值为pandas标准缺失值格式,将无匹配时的返回值从空字符串
''替换为pd.NA即可
内容的提问来源于stack exchange,提问作者ross jim
相关产品推荐
相关产品推荐

