如何基于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, "")
逻辑说明:
- 拆分逗号分隔的关键词为独立条目
- 用
SEARCH检查描述是否包含关键词(不区分大小写) SUMPRODUCT统计匹配数量:>0表示有匹配的Accepted关键词,=0表示无匹配的Unaccepted关键词- 同时满足两个条件则返回原描述,否则返回空
Google Sheets 简化公式
利用内置正则函数实现更简洁的写法:
=IF(AND(REGEXMATCH(A2, TEXTJOIN("|", TRUE, SPLIT(B2, ","))), NOT(REGEXMATCH(A2, TEXTJOIN("|", TRUE, SPLIT(C2, ","))))), A2, "")
逻辑说明:
SPLIT拆分关键词,TEXTJOIN拼接为正则OR模式(如手机|平板)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
相关产品推荐
相关产品推荐

