基于多规则拆分含数值与单位的Code列的技术求助
拆分带单位的数值列方案
直接用pandas的str.extract配合正则表达式就能搞定,比apply+lambda高效得多,还能覆盖你所有的场景——包括只有单位的情况。
正则表达式说明
我们需要匹配两种核心场景:
- 既有数值又有单位(比如
1KG、7.5LB、.5OZ) - 只有单位(比如
OZ)
对应的正则可以这么写:
^(\d*\.?\d+)?([A-Za-z]+)$
各部分含义:
^:匹配字符串开头,避免匹配中间的无关内容(\d*\.?\d+)?:匹配数值部分,支持多种格式:- 整数(
1、50) - 带小数点的小数(
7.5、11.023) - 开头仅带小数点的小数(
.5) - 最后的
?表示数值部分可以不存在(对应只有单位的情况)
- 整数(
([A-Za-z]+):匹配单位部分,支持大小写字母组合(覆盖KG、G、LB、OZ、GM这些)$:匹配字符串结尾,确保单位是最后一部分
完整代码实现
import pandas as pd import re # 示例数据 data = { 'Code': ['1KG', 'OZ', '50LB', '56G', '7.5LB', '.5OZ', '4GM', '11.023LB'] } df = pd.DataFrame(data) # 提取数值和单位,忽略大小写匹配 df[['Code Value', 'Code UOM']] = df['Code'].str.extract(r'^(\d*\.?\d+)?([A-Za-z]+)$', flags=re.IGNORECASE) # 处理只有单位的情况,填充默认数值1 df['Code Value'] = df['Code Value'].fillna('1') # 统一单位为大写(可选,根据需求调整) df['Code UOM'] = df['Code UOM'].str.upper() # 可选:把Code Value转为数值类型,方便后续计算 df['Code Value'] = pd.to_numeric(df['Code Value']) # 输出拆分结果 print(df[['Code Value', 'Code UOM']])
运行结果
| Code Value | Code UOM | |
|---|---|---|
| 0 | 1.0 | KG |
| 1 | 1.0 | OZ |
| 2 | 50.0 | LB |
| 3 | 56.0 | G |
| 4 | 7.5 | LB |
| 5 | 0.5 | OZ |
| 6 | 4.0 | GM |
| 7 | 11.023 | LB |
你原来代码的问题
- 语法错误:字符串没有
search方法,应该用re.search调用正则 - 正则逻辑错误:没匹配数值部分,
\Boz|kg|lb|g|gm\w+的写法无法定位单位的正确位置,也没考虑大小写 - 未处理无数值的场景:没法生成默认的数值1
内容的提问来源于stack exchange,提问作者htank
相关产品推荐
相关产品推荐

