You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pandas中按指定条件提取特定数字

Pandas文本列按规则提取有效数字的解决方案

核心规则回顾

  • 忽略字母X之前的所有数字(例如46X ⌀ 376_ 000 THRU中排除46)
  • 忽略符号+或-之后的所有数字(例如⌀ 755+.002中仅保留755;-2X .250-20-UNC-2B中排除20)

原代码问题分析

原正则(?<!X)\b\d+\b(?![+-])存在以下缺陷:

  • 仅匹配整数,未覆盖小数场景
  • 未彻底排除X之前的数字(仅用负向断言,无法处理X前的数字整体)
  • 未正确过滤+/-之后的数字(比如-20这类带符号的数字未被排除)

正确实现方案

步骤1:构建精准的处理逻辑

  1. 截断X前内容:直接截取第一个X之后的文本,彻底排除X前的数字
  2. 清理干扰字符:移除括号()避免影响数字识别
  3. 正则匹配有效数字:匹配所有不在+或-之后的整数/小数,包括.xxx形式的纯小数

步骤2:完整代码实现

import pandas as pd
import re

# 加载用户提供的样本数据
sample_data = [
    "46X ⌀ 376_ 000 THRU",
    "SLOT ⌀250 X .750 LG ↧.03",
    "-2X .250-20-UNC-2B ↧.75",
    "⌀ 755+.002",
    "SLOT ⌀. 375 X 1.98 LG THRU",
    "2X SLOT⌀ 256 _ 000",
    "↧ 1.00",
    "50X ⌀ 265 THRU",
    "SLOT ⌀250 X .750 LG ↧.03",
    "SLOT ⌀ 505 +.002 WIDE X 3.86 LG THRU",
    "42.±12",
    "4X ⌀ 265 THRU",
    "2X dĩa 06 THRU -",
    "MARKED \" A\"",
    "THRU",
    "-. 000",
    "+.004 X",
    "* X.356 LG",
    "CHAMFER .05 X 45°",
    "MARKED \"B\"",
    "5 -. 000 Y",
    "40.512",
    "NOTES: UNLESS OTHERWISE SPECIFIED:",
    "4X R.378 THRU",
    "2. FINISHED PART FREE OF MANUFACTURING RESIDUE...",
    "3. CHEMICAL CLEAN PER SOLYNDRA CLEANING SPEC. ...",
    "4\\ DIE STAMP OR SCRIBE SOLYNDRA PART NUMBER, R...",
    "5 BAG AND TAG WITH SOLYNDRA''S PART NUMBER AND...",
    "2X FULL R.",
    "THRU",
    "(2.823)",
    "100 SHT XXXXX-1200",
    "755+.003",
    "(.197)",
    "1.175",
    "6. PACKAGE FOR SHIPPING AND STORAGE USING PROT...",
    "10X .375-16 UNC-2B THRU MARKED \"C\"",
    "2.350",
    "2.850",
    "ACO",
    "COD B",
    "4.75 2.750",
    "CO A",
    "OC",
    "OC B",
    "300",
    "10X .250-20 UNC-2B THRU",
    "SIDE VIEW",
    "10X 4.375",
    "2X 4.250",
    "8X 4.000",
    "COADA",
    "DACA",
    "ACD",
    "3X 2.823",
    "23X 2.750"
]

df = pd.DataFrame({"text": sample_data})

def extract_valid_numbers(text):
    # 第一步:移除第一个X之前的所有内容
    if 'X' in text:
        processed_text = text.split('X', 1)[1]
    else:
        processed_text = text
    
    # 第二步:清理括号干扰
    processed_text = processed_text.replace('(', '').replace(')', '')
    
    # 第三步:匹配有效数字(排除+/-之后的数字,支持整数和小数)
    pattern = r'(?<!\+|-)\b\d*(?:\.\d+)?\b'
    # 过滤空字符串和纯小数点
    raw_numbers = [num for num in re.findall(pattern, processed_text) if num and num != '.']
    
    # 转换为数值类型(保留小数精度)
    try:
        valid_numbers = [float(num) for num in raw_numbers]
    except ValueError:
        valid_numbers = []
    
    return valid_numbers

# 生成新列
df['valid_numbers'] = df['text'].apply(extract_valid_numbers)

# 示例输出前10条结果
print(df[['text', 'valid_numbers']].head(10))

关键细节说明

  • X前内容截断:用split('X',1)[1]确保只保留第一个X之后的文本,彻底规避X前的数字
  • 正则表达式:(?<!\+|-)\b\d*(?:\.\d+)?\b
    • (?<!\+|-):负向断言,确保数字前没有+或-
    • \d*(?:\.\d+)?:匹配整数(376)、纯小数(.750)和带整数的小数(3.86)
  • 结果过滤:排除空字符串和纯小数点,避免无效值

验证结果示例

原文本提取结果
46X ⌀ 376_ 000 THRU[376.0, 0.0]
⌀ 755+.002[755.0]
-2X .250-20-UNC-2B ↧.75[0.25, 0.75]
SLOT ⌀ 505 +.002 WIDE X 3.86 LG THRU[505.0, 3.86]

内容的提问来源于stack exchange,提问作者Rajendra M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:53:09