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

如何基于Accepted/Unaccepted关键词列表筛选Item Descriptions列并生成新列?

实现自定义筛选并生成新列的最优方案

根据你的需求,核心逻辑是:保留同时满足「包含至少一个Accepted Keywords」和「不包含任何Unaccepted Keywords」的物品描述,其余返回空值。以下分场景提供最优实现方案:


一、Excel/Google Sheets 公式实现(适合中小数据量)

假设数据从第2行开始,列对应关系为:

  • A列:Item Descriptions
  • B列:Accepted Keywords(多关键词用逗号分隔)
  • C列:Unaccepted Keywords(多关键词用逗号分隔)

Excel 公式

=IF(AND(SUMPRODUCT(--ISNUMBER(SEARCH(TRIM(MID(SUBSTITUTE(B2,",",REPT(" ",LEN(B2))), (ROW(INDIRECT("1:"&LEN(B2)-LEN(SUBSTITUTE(B2,",",""))+1))-1)*LEN(B2)+1, LEN(B2))),A2))>0, SUMPRODUCT(--ISNUMBER(SEARCH(TRIM(MID(SUBSTITUTE(C2,",",REPT(" ",LEN(C2))), (ROW(INDIRECT("1:"&LEN(C2)-LEN(SUBSTITUTE(C2,",",""))+1))-1)*LEN(C2)+1, LEN(C2))),A2))=0), A2, "")

逻辑说明:

  1. 拆分逗号分隔的关键词为独立条目
  2. 用SEARCH检查描述是否包含关键词(不区分大小写)
  3. SUMPRODUCT统计匹配数量:>0表示有匹配的Accepted关键词,=0表示无匹配的Unaccepted关键词
  4. 同时满足两个条件则返回原描述,否则返回空

Google Sheets 简化公式

利用内置正则函数实现更简洁的写法:

=IF(AND(REGEXMATCH(A2, TEXTJOIN("|", TRUE, SPLIT(B2, ","))), NOT(REGEXMATCH(A2, TEXTJOIN("|", TRUE, SPLIT(C2, ","))))), A2, "")

逻辑说明:

  1. SPLIT拆分关键词,TEXTJOIN拼接为正则OR模式(如手机|平板)
  2. REGEXMATCH检查匹配情况,NOT排除含Unaccepted关键词的条目

二、Python Pandas 实现(适合大数据量)

当数据量超过万行时,公式会出现卡顿,用Pandas批量处理效率更高。

基础版代码

import pandas as pd

# 读取数据(替换为你的文件路径)
df = pd.read_csv("your_data.csv")

def filter_desc(row):
    # 拆分关键词并去除空值
    accepted_kws = [kw.strip() for kw in row["Accepted Keywords"].split(",") if kw.strip()]
    unaccepted_kws = [kw.strip() for kw in row["Unaccepted Keywords"].split(",") if kw.strip()]
    
    # 检查匹配条件
    has_accepted = any(kw in row["Item Descriptions"] for kw in accepted_kws)
    no_unaccepted = all(kw not in row["Item Descriptions"] for kw in unaccepted_kws)
    
    return row["Item Descriptions"] if has_accepted and no_unaccepted else ""

# 生成新列
df["Filtered Descriptions"] = df.apply(filter_desc, axis=1)

# 保存结果
df.to_csv("filtered_data.csv", index=False)

优化版(正则批量匹配,速度更快)

如果需要支持正则匹配或全词匹配,可调整为:

import pandas as pd
import re

df = pd.read_csv("your_data.csv")

# 生成正则匹配模式(支持全词匹配则加r'\b')
df["accepted_regex"] = df["Accepted Keywords"].apply(
    lambda x: "|".join([re.escape(kw.strip()) for kw in x.split(",") if kw.strip()])
)
df["unaccepted_regex"] = df["Unaccepted Keywords"].apply(
    lambda x: "|".join([re.escape(kw.strip()) for kw in x.split(",") if kw.strip()])
)

# 批量筛选
df["Filtered Descriptions"] = df.apply(
    lambda row: row["Item Descriptions"]
    if (row["accepted_regex"] and re.search(row["accepted_regex"], row["Item Descriptions"], re.IGNORECASE))
       and (not row["unaccepted_regex"] or not re.search(row["unaccepted_regex"], row["Item Descriptions"], re.IGNORECASE))
    else "",
    axis=1
)

df.to_csv("filtered_data.csv", index=False)

三、关键注意事项

  • 分隔符适配:如果关键词用其他符号分隔(如分号),需对应修改公式/代码中的分隔符参数
  • 大小写控制:Excel的SEARCH、Pandas的re.IGNORECASE均为不区分大小写,若需区分,替换为FIND(Excel)或去掉re.IGNORECASE(Pandas)
  • 全词匹配:若需避免部分匹配(如"手机"不匹配"手机壳"),需在关键词前后添加单词边界标记(Excel用"\b"&kw&"\b",Pandas用r'\b' + kw + r'\b')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:14:54