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

如何用搜索词列表筛选含术语列表的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:45:38