如何用向量化方法筛选DataFrame中指定字符串不在集合列的ID
向量化方法筛选符合条件的ID
方法一:列表推导式生成掩码(简洁高效)
对于中等规模数据集,用列表推导式生成布尔掩码是比apply更高效的选择,后续结合pandas的向量化索引操作完成筛选:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ "id": [55, 1, 1, 2], "to_filter": [set(), set(), {"blah"}, {"blah"}] }) inpt = "blah" # 生成布尔掩码:标记to_filter不包含目标字符串的行 mask = np.array([inpt not in s for s in df['to_filter']]) # 提取对应ID并去重(因为ID可能重复) ids = df.loc[mask, 'id'].unique().tolist()
运行结果:ids = [55, 1],符合预期。
方法二:完全向量化操作(适合超大规模数据集)
如果你的DataFrame行数极多,推荐用完全向量化的方式处理——通过展开集合列,利用pandas内置的向量化函数完成筛选,避免逐行循环:
import pandas as pd df = pd.DataFrame({ "id": [55, 1, 1, 2], "to_filter": [set(), set(), {"blah"}, {"blah"}] }) inpt = "blah" # 将集合列展开为多行 exploded_df = df.explode('to_filter', ignore_index=True) # 找出所有包含目标字符串的ID exclude_ids = exploded_df[exploded_df['to_filter'] == inpt]['id'].unique() # 筛选出不在排除列表中的ID并去重 ids = df[~df['id'].isin(exclude_ids)]['id'].unique().tolist()
这种方法依赖pandas的explode和isin操作,二者都是底层用C实现的向量化操作,在超大规模数据上的性能远优于逐行循环。
两种方法对比
- 方法一:代码简洁,实现成本低,中等规模数据下速度足够快;
- 方法二:完全规避逐行操作,超大规模数据下性能优势明显,适合处理百万级以上行数的DataFrame。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

