如何在DataFrame的字符串列中提取特定度量值至新列?
提取药物名称中的度量值到新列的实现方法
需求概述
从数据集的name列字符串中提取度量值(仅匹配包含mg/ml/g的形式,如200ML、100MG),新增measurement列存储结果,无匹配值则填充NaN。
输入数据
| name | price |
|---|---|
| A CERUMEN UNIDOSE B/10 AFR | 125 |
| ACARILBIAL SOL EXT FL/200ML | 8569 |
| ACCULOL 0.5% CY FL/5ML | 563 |
| ACEFLAMEX 100MG CP B/20 | 12563 |
| ACFOL 5MG COMP B/25 | 896 |
期望输出
| name | price | measurement |
|---|---|---|
| A CERUMEN UNIDOSE B/10 AFR | 125 | NaN |
| ACARILBIAL SOL EXT FL/200ML | 8569 | 200ML |
| ACCULOL 0.5% CY FL/5ML | 563 | 5ML |
| ACEFLAMEX 100MG CP B/20 | 12563 | 100MG |
| ACFOL 5MG COMP B/25 | 896 | 5MG |
解决方案
不需要将列转为列表处理,直接使用Pandas的矢量化字符串方法结合正则表达式,可自动与原DataFrame的行对齐,避免匹配错位问题。
完整代码
import pandas as pd import re import numpy as np # 构造示例数据集 data = { 'name': [ 'A CERUMEN UNIDOSE B/10 AFR', 'ACARILBIAL SOL EXT FL/200ML', 'ACCULOL 0.5% CY FL/5ML', 'ACEFLAMEX 100MG CP B/20', 'ACFOL 5MG COMP B/25' ], 'price': [125, 8569, 563, 12563, 896] } df = pd.DataFrame(data) # 提取度量值:匹配数字+MG/ML/G(忽略大小写) df['measurement'] = df['name'].str.extract(r'(\d+[MGMLgmL]+)', flags=re.IGNORECASE) # 无匹配值填充为NaN(若需要字符串形式的"nan",可替换为df['measurement'] = df['measurement'].fillna('nan')) df['measurement'] = df['measurement'].fillna(np.nan) print(df)
代码说明
- 正则表达式:
r'(\d+[MGMLgmL]+)'\d+:匹配1个或多个数字[MGMLgmL]+:匹配任意大小写的MG/ML/G组合,覆盖用户需求的所有格式flags=re.IGNORECASE:忽略大小写,确保mg、ML等变体都能被匹配
str.extract方法:Pandas内置的字符串提取方法,会自动将匹配结果映射到对应行,无匹配则返回NaN,无需手动维护索引对齐- 填充NaN:根据需求选择填充为Pandas原生
NaN或字符串形式的"nan"
内容的提问来源于stack exchange,提问作者Cláudio Rosa
相关产品推荐
相关产品推荐

