如何用搜索词列表筛选含术语列表的DataFrame行?
问题:用搜索词列表向量化筛选包含任意匹配项的DataFrame行
需要筛选DataFrame,判断每行的术语列表是否包含filter_by中的任意一个术语,保留满足OR条件的行。已尝试将每行转为字符串用str.contains("|".join(filter_by))、apply()自定义函数,但希望找到简洁且可向量化的解决方案。
示例数据
搜索词列表:
filter_by = ["CSV", "JPG", "TXT"]
目标DataFrame:
import pandas as pd df = pd.DataFrame({ "data": [ ["JPG", "XML", "PDF", "TXT", "XLS", "XLSX"], ["XLS", "JPG", "PDF", "XLSX"], ["JPG", "PDF", "TXT"], ["XLS", "PDF", "XML", "JPG"], ["CSV"], ["PDF", "TXT", "XLS"], ["XML"], ["JPG"], ["PDF", "CSV", "XML", "XLS", "TXT", "JPG"], ["TXT", "CSV", "XLS", "XLSX", "PDF", "JPG"] ] })
注:df[df.data.isin(filter_by)]和.query()无法解决此问题——前者判断的是整个列表是否完全匹配搜索词,而非列表包含任意搜索词;后者无直接处理列表包含逻辑的语法。
向量化解决方案
方案1:explode + 分组判断
利用explode将每行的列表拆分为多行,结合isin判断匹配,最后按原行分组确认是否存在任意匹配项:
# 生成匹配掩码 mask = df['data'].explode().isin(filter_by).groupby(level=0).any() # 筛选结果 result = df[mask]
方案2:str.get_dummies + 列求和
将列表转为分隔字符串后生成哑变量矩阵,对目标搜索词列求和,判断是否存在匹配:
# 生成哑变量矩阵 dummies = df['data'].str.join('|').str.get_dummies(sep='|') # 生成匹配掩码:只要搜索词列有任意一个为1,求和结果>0 mask = dummies[filter_by].sum(axis=1) > 0 # 筛选结果 result = df[mask]
两种方案均为向量化操作,避免了apply自定义函数的循环开销,处理大数据集时效率更优。
内容的提问来源于stack exchange,提问作者petezurich
相关产品推荐
相关产品推荐

