Pandas如何高效筛选列表类型列中包含指定列表任意元素的行
Pandas列表列多元素匹配筛选方案
你之前用isin失效的原因是:isin方法是判断整列的单个元素是否存在于目标列表,而你的property列元素本身是列表,isin会把整个列表当作判断对象,自然不符合需求。
直接用apply结合集合运算即可实现高效筛选,步骤如下:
- 先将check列表转换为集合,大幅提升元素查找效率
check = ['bar', 'baz'] check_set = set(check)
- 构造筛选布尔掩码,判断每行列表与check集合是否存在公共元素
这里推荐用集合的isdisjoint方法,性能比计算交集长度更高:只要找到一个公共元素就会终止判断,不需要遍历完整个列表
mask = property['property'].apply(lambda x: not check_set.isdisjoint(x))
- 用布尔掩码筛选符合条件的行
result_df = property[mask]
效果验证
和你给出的匹配规则完全一致:
- 当
check = ['bar']时,返回索引为1的Gousto行 - 当
check = ['bar','baz']时,返回索引为1的Gousto行 - 当
check = ['too']时,返回两行所有数据 - 当
check = ['foobar']时,返回索引为0的Deliveroo行
内容的提问来源于stack exchange,提问作者luigi cogliani
相关产品推荐
相关产品推荐

