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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 02:24:10