Python中基于条件从Pandas DataFrame提取带%/g标识文本的方法咨询
实现步骤
1. 预处理阶段优化
你原本逐行循环拆分逗号的写法运行效率低,还容易触发SettingWithCopyWarning,可以替换为pandas向量化操作,效果完全一致:
# 向量化方式拆分逗号为列表结构,替代原逐行循环代码 df['ingredients_text'] = df['ingredients_text'].str.split(',')
2. 提取规则设计
因为部分带单位的成分嵌套在括号说明里,仅在顶级拆分列表里筛选会漏掉内容,所以采用全局正则匹配的方式,精准提取符合要求的片段,同时自动剔除片段后附带的括号注释、无意义说明文字:
- 匹配要求:片段内必须包含带数字的%标识(支持逗号做小数分隔,比如
8,5%),或者带数字的g重量单位标识(比如20g、0.5g) - 匹配边界:遇到逗号、冒号、右括号这类分隔符即停止截取,不会夹杂后续无关内容
3. 代码实现
导入正则处理库re,定义提取逻辑,将结果赋值给名为ingredient的新列:
import re def extract_matching_ingredients(text_list): # 将拆分后的列表拼接为完整文本,方便全局匹配嵌套在括号内的成分 full_text = ','.join(text_list) # 正则匹配所有符合要求的片段 matches = re.findall( r'([^,:)(]+?\d+(?:[,.]\d+)?\s*(?:%|g)[^,:)(]*)', full_text ) # 清洗片段首尾多余空格 cleaned_result = [item.strip() for item in matches] return cleaned_result # 生成新列 df['ingredient'] = df['ingredients_text'].apply(extract_matching_ingredients)
效果验证
运行代码后,对给出的两条样例文本,输出结果和预期完全对齐:
- 第一行输出:
['farine de blé 34%', 'pépites de chocolat 20g','cacao : 44%' ,'8,5% chocolat' ,'cacao: 38%', '5,5% éclats de noix de pécan'] - 第二行输出:
['oignon 18g oil hell', '100g produkt enthalten', 'lt;0.5g', 'lt;0.1g' , '26g zucker']
注意:正则规则可以根据实际数据里的格式微调,比如如果存在
kg这类需要排除的带g单位,可以在匹配规则里增加反向匹配,排除数字后紧跟kg的片段即可。
内容的提问来源于stack exchange,提问作者Yoss
相关产品推荐
相关产品推荐

